@@ -839,27 +839,6 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
839
839
// Type Conversion
840
840
// ===--------------------------------------------------------------------===//
841
841
842
- // / Attempt to convert the signature of the given block, if successful a new
843
- // / block is returned containing the new arguments. Returns `block` if it did
844
- // / not require conversion.
845
- FailureOr<Block *> convertBlockSignature (
846
- ConversionPatternRewriter &rewriter, Block *block,
847
- const TypeConverter *converter,
848
- TypeConverter::SignatureConversion *conversion = nullptr );
849
-
850
- // / Convert the types of non-entry block arguments within the given region.
851
- LogicalResult convertNonEntryRegionTypes (
852
- ConversionPatternRewriter &rewriter, Region *region,
853
- const TypeConverter &converter,
854
- ArrayRef<TypeConverter::SignatureConversion> blockConversions = {});
855
-
856
- // / Apply a signature conversion on the given region, using `converter` for
857
- // / materializations if not null.
858
- Block *
859
- applySignatureConversion (ConversionPatternRewriter &rewriter, Region *region,
860
- TypeConverter::SignatureConversion &conversion,
861
- const TypeConverter *converter);
862
-
863
842
// / Convert the types of block arguments within the given region.
864
843
FailureOr<Block *>
865
844
convertRegionTypes (ConversionPatternRewriter &rewriter, Region *region,
@@ -1294,34 +1273,6 @@ bool ConversionPatternRewriterImpl::wasOpReplaced(Operation *op) const {
1294
1273
// ===----------------------------------------------------------------------===//
1295
1274
// Type Conversion
1296
1275
1297
- FailureOr<Block *> ConversionPatternRewriterImpl::convertBlockSignature (
1298
- ConversionPatternRewriter &rewriter, Block *block,
1299
- const TypeConverter *converter,
1300
- TypeConverter::SignatureConversion *conversion) {
1301
- if (conversion)
1302
- return applySignatureConversion (rewriter, block, converter, *conversion);
1303
-
1304
- // If a converter wasn't provided, and the block wasn't already converted,
1305
- // there is nothing we can do.
1306
- if (!converter)
1307
- return failure ();
1308
-
1309
- // Try to convert the signature for the block with the provided converter.
1310
- if (auto conversion = converter->convertBlockSignature (block))
1311
- return applySignatureConversion (rewriter, block, converter, *conversion);
1312
- return failure ();
1313
- }
1314
-
1315
- Block *ConversionPatternRewriterImpl::applySignatureConversion (
1316
- ConversionPatternRewriter &rewriter, Region *region,
1317
- TypeConverter::SignatureConversion &conversion,
1318
- const TypeConverter *converter) {
1319
- if (!region->empty ())
1320
- return *convertBlockSignature (rewriter, ®ion->front (), converter,
1321
- &conversion);
1322
- return nullptr ;
1323
- }
1324
-
1325
1276
FailureOr<Block *> ConversionPatternRewriterImpl::convertRegionTypes (
1326
1277
ConversionPatternRewriter &rewriter, Region *region,
1327
1278
const TypeConverter &converter,
@@ -1330,42 +1281,29 @@ FailureOr<Block *> ConversionPatternRewriterImpl::convertRegionTypes(
1330
1281
if (region->empty ())
1331
1282
return nullptr ;
1332
1283
1333
- if (failed (convertNonEntryRegionTypes (rewriter, region, converter)))
1334
- return failure ();
1335
-
1336
- FailureOr<Block *> newEntry = convertBlockSignature (
1337
- rewriter, ®ion->front (), &converter, entryConversion);
1338
- return newEntry;
1339
- }
1340
-
1341
- LogicalResult ConversionPatternRewriterImpl::convertNonEntryRegionTypes (
1342
- ConversionPatternRewriter &rewriter, Region *region,
1343
- const TypeConverter &converter,
1344
- ArrayRef<TypeConverter::SignatureConversion> blockConversions) {
1345
- regionToConverter[region] = &converter;
1346
- if (region->empty ())
1347
- return success ();
1348
-
1349
- // Convert the arguments of each block within the region.
1350
- int blockIdx = 0 ;
1351
- assert ((blockConversions.empty () ||
1352
- blockConversions.size () == region->getBlocks ().size () - 1 ) &&
1353
- " expected either to provide no SignatureConversions at all or to "
1354
- " provide a SignatureConversion for each non-entry block" );
1355
-
1284
+ // Convert the arguments of each non-entry block within the region.
1356
1285
for (Block &block :
1357
1286
llvm::make_early_inc_range (llvm::drop_begin (*region, 1 ))) {
1358
- TypeConverter::SignatureConversion *blockConversion =
1359
- blockConversions.empty ()
1360
- ? nullptr
1361
- : const_cast <TypeConverter::SignatureConversion *>(
1362
- &blockConversions[blockIdx++]);
1363
-
1364
- if (failed (convertBlockSignature (rewriter, &block, &converter,
1365
- blockConversion)))
1287
+ // Compute the signature for the block with the provided converter.
1288
+ std::optional<TypeConverter::SignatureConversion> conversion =
1289
+ converter.convertBlockSignature (&block);
1290
+ if (!conversion)
1366
1291
return failure ();
1367
- }
1368
- return success ();
1292
+ // Convert the block with the computed signature.
1293
+ applySignatureConversion (rewriter, &block, &converter, *conversion);
1294
+ }
1295
+
1296
+ // Convert the entry block. If an entry signature conversion was provided,
1297
+ // use that one. Otherwise, compute the signature with the type converter.
1298
+ if (entryConversion)
1299
+ return applySignatureConversion (rewriter, ®ion->front (), &converter,
1300
+ *entryConversion);
1301
+ std::optional<TypeConverter::SignatureConversion> conversion =
1302
+ converter.convertBlockSignature (®ion->front ());
1303
+ if (!conversion)
1304
+ return failure ();
1305
+ return applySignatureConversion (rewriter, ®ion->front (), &converter,
1306
+ *conversion);
1369
1307
}
1370
1308
1371
1309
Block *ConversionPatternRewriterImpl::applySignatureConversion (
@@ -1676,12 +1614,12 @@ void ConversionPatternRewriter::eraseBlock(Block *block) {
1676
1614
}
1677
1615
1678
1616
Block *ConversionPatternRewriter::applySignatureConversion (
1679
- Region *region , TypeConverter::SignatureConversion &conversion,
1617
+ Block *block , TypeConverter::SignatureConversion &conversion,
1680
1618
const TypeConverter *converter) {
1681
- assert (!impl->wasOpReplaced (region ->getParentOp ()) &&
1619
+ assert (!impl->wasOpReplaced (block ->getParentOp ()) &&
1682
1620
" attempting to apply a signature conversion to a block within a "
1683
1621
" replaced/erased op" );
1684
- return impl->applySignatureConversion (*this , region, conversion, converter );
1622
+ return impl->applySignatureConversion (*this , block, converter, conversion );
1685
1623
}
1686
1624
1687
1625
FailureOr<Block *> ConversionPatternRewriter::convertRegionTypes (
@@ -1693,16 +1631,6 @@ FailureOr<Block *> ConversionPatternRewriter::convertRegionTypes(
1693
1631
return impl->convertRegionTypes (*this , region, converter, entryConversion);
1694
1632
}
1695
1633
1696
- LogicalResult ConversionPatternRewriter::convertNonEntryRegionTypes (
1697
- Region *region, const TypeConverter &converter,
1698
- ArrayRef<TypeConverter::SignatureConversion> blockConversions) {
1699
- assert (!impl->wasOpReplaced (region->getParentOp ()) &&
1700
- " attempting to apply a signature conversion to a block within a "
1701
- " replaced/erased op" );
1702
- return impl->convertNonEntryRegionTypes (*this , region, converter,
1703
- blockConversions);
1704
- }
1705
-
1706
1634
void ConversionPatternRewriter::replaceUsesOfBlockArgument (BlockArgument from,
1707
1635
Value to) {
1708
1636
LLVM_DEBUG ({
@@ -2231,11 +2159,14 @@ LogicalResult OperationLegalizer::legalizePatternBlockRewrites(
2231
2159
// If the region of the block has a type converter, try to convert the block
2232
2160
// directly.
2233
2161
if (auto *converter = impl.regionToConverter .lookup (block->getParent ())) {
2234
- if (failed (impl.convertBlockSignature (rewriter, block, converter))) {
2162
+ std::optional<TypeConverter::SignatureConversion> conversion =
2163
+ converter->convertBlockSignature (block);
2164
+ if (!conversion) {
2235
2165
LLVM_DEBUG (logFailure (impl.logger , " failed to convert types of moved "
2236
2166
" block" ));
2237
2167
return failure ();
2238
2168
}
2169
+ impl.applySignatureConversion (rewriter, block, converter, *conversion);
2239
2170
continue ;
2240
2171
}
2241
2172
0 commit comments