@@ -250,10 +250,10 @@ enum class BlockActionKind {
250250};
251251
252252// / Original position of the given block in its parent region. During undo
253- // / actions, the block needs to be placed after `insertAfterBlock `.
253+ // / actions, the block needs to be placed before `insertBeforeBlock `.
254254struct BlockPosition {
255255 Region *region;
256- Block *insertAfterBlock ;
256+ Block *insertBeforeBlock ;
257257};
258258
259259// / Information needed to undo inlining actions.
@@ -910,7 +910,8 @@ struct ConversionPatternRewriterImpl {
910910 void notifyBlockIsBeingErased (Block *block);
911911
912912 // / Notifies that a block was created.
913- void notifyCreatedBlock (Block *block);
913+ void notifyInsertedBlock (Block *block, Region *previous,
914+ Region::iterator previousIt);
914915
915916 // / Notifies that a block was split.
916917 void notifySplitBlock (Block *block, Block *continuation);
@@ -919,10 +920,6 @@ struct ConversionPatternRewriterImpl {
919920 void notifyBlockBeingInlined (Block *block, Block *srcBlock,
920921 Block::iterator before);
921922
922- // / Notifies that the blocks of a region are about to be moved.
923- void notifyRegionIsBeingInlinedBefore (Region ®ion, Region &parent,
924- Region::iterator before);
925-
926923 // / Notifies that a pattern match failed for the given reason.
927924 LogicalResult
928925 notifyMatchFailure (Location loc,
@@ -1173,10 +1170,9 @@ void ConversionPatternRewriterImpl::undoBlockActions(
11731170 // Put the block (owned by action) back into its original position.
11741171 case BlockActionKind::Erase: {
11751172 auto &blockList = action.originalPosition .region ->getBlocks ();
1176- Block *insertAfterBlock = action.originalPosition .insertAfterBlock ;
1177- blockList.insert ((insertAfterBlock
1178- ? std::next (Region::iterator (insertAfterBlock))
1179- : blockList.begin ()),
1173+ Block *insertBeforeBlock = action.originalPosition .insertBeforeBlock ;
1174+ blockList.insert ((insertBeforeBlock ? Region::iterator (insertBeforeBlock)
1175+ : blockList.end ()),
11801176 action.block );
11811177 break ;
11821178 }
@@ -1196,10 +1192,10 @@ void ConversionPatternRewriterImpl::undoBlockActions(
11961192 // Move the block back to its original position.
11971193 case BlockActionKind::Move: {
11981194 Region *originalRegion = action.originalPosition .region ;
1199- Block *insertAfterBlock = action.originalPosition .insertAfterBlock ;
1195+ Block *insertBeforeBlock = action.originalPosition .insertBeforeBlock ;
12001196 originalRegion->getBlocks ().splice (
1201- (insertAfterBlock ? std::next ( Region::iterator (insertAfterBlock) )
1202- : originalRegion->end ()),
1197+ (insertBeforeBlock ? Region::iterator (insertBeforeBlock )
1198+ : originalRegion->end ()),
12031199 action.block ->getParent ()->getBlocks (), action.block );
12041200 break ;
12051201 }
@@ -1398,12 +1394,19 @@ void ConversionPatternRewriterImpl::notifyOpReplaced(Operation *op,
13981394
13991395void ConversionPatternRewriterImpl::notifyBlockIsBeingErased (Block *block) {
14001396 Region *region = block->getParent ();
1401- Block *origPrevBlock = block->getPrevNode ();
1402- blockActions.push_back (BlockAction::getErase (block, {region, origPrevBlock }));
1397+ Block *origNextBlock = block->getNextNode ();
1398+ blockActions.push_back (BlockAction::getErase (block, {region, origNextBlock }));
14031399}
14041400
1405- void ConversionPatternRewriterImpl::notifyCreatedBlock (Block *block) {
1406- blockActions.push_back (BlockAction::getCreate (block));
1401+ void ConversionPatternRewriterImpl::notifyInsertedBlock (
1402+ Block *block, Region *previous, Region::iterator previousIt) {
1403+ if (!previous) {
1404+ // This is a newly created block.
1405+ blockActions.push_back (BlockAction::getCreate (block));
1406+ return ;
1407+ }
1408+ Block *prevBlock = previousIt == previous->end () ? nullptr : &*previousIt;
1409+ blockActions.push_back (BlockAction::getMove (block, {previous, prevBlock}));
14071410}
14081411
14091412void ConversionPatternRewriterImpl::notifySplitBlock (Block *block,
@@ -1416,19 +1419,6 @@ void ConversionPatternRewriterImpl::notifyBlockBeingInlined(
14161419 blockActions.push_back (BlockAction::getInline (block, srcBlock, before));
14171420}
14181421
1419- void ConversionPatternRewriterImpl::notifyRegionIsBeingInlinedBefore (
1420- Region ®ion, Region &parent, Region::iterator before) {
1421- if (region.empty ())
1422- return ;
1423- Block *laterBlock = ®ion.back ();
1424- for (auto &earlierBlock : llvm::drop_begin (llvm::reverse (region), 1 )) {
1425- blockActions.push_back (
1426- BlockAction::getMove (laterBlock, {®ion, &earlierBlock}));
1427- laterBlock = &earlierBlock;
1428- }
1429- blockActions.push_back (BlockAction::getMove (laterBlock, {®ion, nullptr }));
1430- }
1431-
14321422LogicalResult ConversionPatternRewriterImpl::notifyMatchFailure (
14331423 Location loc, function_ref<void (Diagnostic &)> reasonCallback) {
14341424 LLVM_DEBUG ({
@@ -1551,8 +1541,9 @@ ConversionPatternRewriter::getRemappedValues(ValueRange keys,
15511541 results);
15521542}
15531543
1554- void ConversionPatternRewriter::notifyBlockCreated (Block *block) {
1555- impl->notifyCreatedBlock (block);
1544+ void ConversionPatternRewriter::notifyBlockInserted (
1545+ Block *block, Region *previous, Region::iterator previousIt) {
1546+ impl->notifyInsertedBlock (block, previous, previousIt);
15561547}
15571548
15581549Block *ConversionPatternRewriter::splitBlock (Block *block,
@@ -1582,13 +1573,6 @@ void ConversionPatternRewriter::inlineBlockBefore(Block *source, Block *dest,
15821573 eraseBlock (source);
15831574}
15841575
1585- void ConversionPatternRewriter::inlineRegionBefore (Region ®ion,
1586- Region &parent,
1587- Region::iterator before) {
1588- impl->notifyRegionIsBeingInlinedBefore (region, parent, before);
1589- PatternRewriter::inlineRegionBefore (region, parent, before);
1590- }
1591-
15921576void ConversionPatternRewriter::cloneRegionBefore (Region ®ion,
15931577 Region &parent,
15941578 Region::iterator before,
@@ -1600,7 +1584,7 @@ void ConversionPatternRewriter::cloneRegionBefore(Region ®ion,
16001584
16011585 for (Block &b : ForwardDominanceIterator<>::makeIterable (region)) {
16021586 Block *cloned = mapping.lookup (&b);
1603- impl->notifyCreatedBlock (cloned);
1587+ impl->notifyInsertedBlock (cloned, /* previous= */ nullptr , /* previousIt= */ {} );
16041588 cloned->walk <WalkOrder::PreOrder, ForwardDominanceIterator<>>(
16051589 [&](Operation *op) { notifyOperationInserted (op, /* previous=*/ {}); });
16061590 }
0 commit comments