@@ -839,27 +839,6 @@ struct ConversionPatternRewriterImpl : public RewriterBase::Listener {
839839 // Type Conversion
840840 // ===--------------------------------------------------------------------===//
841841
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-
863842 // / Convert the types of block arguments within the given region.
864843 FailureOr<Block *>
865844 convertRegionTypes (ConversionPatternRewriter &rewriter, Region *region,
@@ -1294,34 +1273,6 @@ bool ConversionPatternRewriterImpl::wasOpReplaced(Operation *op) const {
12941273// ===----------------------------------------------------------------------===//
12951274// Type Conversion
12961275
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-
13251276FailureOr<Block *> ConversionPatternRewriterImpl::convertRegionTypes (
13261277 ConversionPatternRewriter &rewriter, Region *region,
13271278 const TypeConverter &converter,
@@ -1330,42 +1281,29 @@ FailureOr<Block *> ConversionPatternRewriterImpl::convertRegionTypes(
13301281 if (region->empty ())
13311282 return nullptr ;
13321283
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.
13561285 for (Block &block :
13571286 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)
13661291 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);
13691307}
13701308
13711309Block *ConversionPatternRewriterImpl::applySignatureConversion (
@@ -1676,12 +1614,12 @@ void ConversionPatternRewriter::eraseBlock(Block *block) {
16761614}
16771615
16781616Block *ConversionPatternRewriter::applySignatureConversion (
1679- Region *region , TypeConverter::SignatureConversion &conversion,
1617+ Block *block , TypeConverter::SignatureConversion &conversion,
16801618 const TypeConverter *converter) {
1681- assert (!impl->wasOpReplaced (region ->getParentOp ()) &&
1619+ assert (!impl->wasOpReplaced (block ->getParentOp ()) &&
16821620 " attempting to apply a signature conversion to a block within a "
16831621 " replaced/erased op" );
1684- return impl->applySignatureConversion (*this , region, conversion, converter );
1622+ return impl->applySignatureConversion (*this , block, converter, conversion );
16851623}
16861624
16871625FailureOr<Block *> ConversionPatternRewriter::convertRegionTypes (
@@ -1693,16 +1631,6 @@ FailureOr<Block *> ConversionPatternRewriter::convertRegionTypes(
16931631 return impl->convertRegionTypes (*this , region, converter, entryConversion);
16941632}
16951633
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-
17061634void ConversionPatternRewriter::replaceUsesOfBlockArgument (BlockArgument from,
17071635 Value to) {
17081636 LLVM_DEBUG ({
@@ -2231,11 +2159,14 @@ LogicalResult OperationLegalizer::legalizePatternBlockRewrites(
22312159 // If the region of the block has a type converter, try to convert the block
22322160 // directly.
22332161 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) {
22352165 LLVM_DEBUG (logFailure (impl.logger , " failed to convert types of moved "
22362166 " block" ));
22372167 return failure ();
22382168 }
2169+ impl.applySignatureConversion (rewriter, block, converter, *conversion);
22392170 continue ;
22402171 }
22412172
0 commit comments