@@ -508,9 +508,11 @@ class InlineBlockRewrite : public BlockRewrite {
508
508
class MoveBlockRewrite : public BlockRewrite {
509
509
public:
510
510
MoveBlockRewrite (ConversionPatternRewriterImpl &rewriterImpl, Block *block,
511
- Region *region, Block *insertBeforeBlock)
512
- : BlockRewrite(Kind::MoveBlock, rewriterImpl, block), region(region),
513
- insertBeforeBlock (insertBeforeBlock) {}
511
+ Region *previousRegion, Region::iterator previousIt)
512
+ : BlockRewrite(Kind::MoveBlock, rewriterImpl, block),
513
+ region (previousRegion),
514
+ insertBeforeBlock(previousIt == previousRegion->end () ? nullptr
515
+ : &*previousIt) {}
514
516
515
517
static bool classof (const IRRewrite *rewrite) {
516
518
return rewrite->getKind () == Kind::MoveBlock;
@@ -617,9 +619,12 @@ class OperationRewrite : public IRRewrite {
617
619
class MoveOperationRewrite : public OperationRewrite {
618
620
public:
619
621
MoveOperationRewrite (ConversionPatternRewriterImpl &rewriterImpl,
620
- Operation *op, Block *block, Operation *insertBeforeOp)
621
- : OperationRewrite(Kind::MoveOperation, rewriterImpl, op), block(block),
622
- insertBeforeOp (insertBeforeOp) {}
622
+ Operation *op, OpBuilder::InsertPoint previous)
623
+ : OperationRewrite(Kind::MoveOperation, rewriterImpl, op),
624
+ block (previous.getBlock()),
625
+ insertBeforeOp(previous.getPoint() == previous.getBlock()->end()
626
+ ? nullptr
627
+ : &*previous.getPoint()) {}
623
628
624
629
static bool classof (const IRRewrite *rewrite) {
625
630
return rewrite->getKind () == Kind::MoveOperation;
@@ -1588,23 +1593,30 @@ Value ConversionPatternRewriterImpl::findOrBuildReplacementValue(
1588
1593
1589
1594
void ConversionPatternRewriterImpl::notifyOperationInserted (
1590
1595
Operation *op, OpBuilder::InsertPoint previous) {
1596
+ // If no previous insertion point is provided, the op used to be detached.
1597
+ bool wasDetached = !previous.isSet ();
1591
1598
LLVM_DEBUG ({
1592
- logger.startLine () << " ** Insert : '" << op->getName () << " '(" << op
1593
- << " )\n " ;
1599
+ logger.startLine () << " ** Insert : '" << op->getName () << " ' (" << op
1600
+ << " )" ;
1601
+ if (wasDetached)
1602
+ logger.getOStream () << " (was detached)" ;
1603
+ logger.getOStream () << " \n " ;
1594
1604
});
1595
1605
assert (!wasOpReplaced (op->getParentOp ()) &&
1596
1606
" attempting to insert into a block within a replaced/erased op" );
1597
1607
1598
- if (!previous.isSet ()) {
1599
- // This is a newly created op.
1608
+ if (wasDetached) {
1609
+ // If the op was detached, it is most likely a newly created op.
1610
+ // TODO: If the same op is inserted multiple times from a detached state,
1611
+ // the rollback mechanism may erase the same op multiple times. This is a
1612
+ // bug in the rollback-based dialect conversion driver.
1600
1613
appendRewrite<CreateOperationRewrite>(op);
1601
1614
patternNewOps.insert (op);
1602
1615
return ;
1603
1616
}
1604
- Operation *prevOp = previous.getPoint () == previous.getBlock ()->end ()
1605
- ? nullptr
1606
- : &*previous.getPoint ();
1607
- appendRewrite<MoveOperationRewrite>(op, previous.getBlock (), prevOp);
1617
+
1618
+ // The op was moved from one place to another.
1619
+ appendRewrite<MoveOperationRewrite>(op, previous);
1608
1620
}
1609
1621
1610
1622
void ConversionPatternRewriterImpl::replaceOp (
@@ -1669,29 +1681,39 @@ void ConversionPatternRewriterImpl::eraseBlock(Block *block) {
1669
1681
1670
1682
void ConversionPatternRewriterImpl::notifyBlockInserted (
1671
1683
Block *block, Region *previous, Region::iterator previousIt) {
1672
- assert (!wasOpReplaced (block->getParentOp ()) &&
1673
- " attempting to insert into a region within a replaced/erased op" );
1684
+ // If no previous insertion point is provided, the block used to be detached.
1685
+ bool wasDetached = !previous;
1686
+ Operation *newParentOp = block->getParentOp ();
1674
1687
LLVM_DEBUG (
1675
1688
{
1676
- Operation *parent = block-> getParentOp () ;
1689
+ Operation *parent = newParentOp ;
1677
1690
if (parent) {
1678
1691
logger.startLine () << " ** Insert Block into : '" << parent->getName ()
1679
- << " '(" << parent << " )\n " ;
1692
+ << " ' (" << parent << " )" ;
1680
1693
} else {
1681
1694
logger.startLine ()
1682
- << " ** Insert Block into detached Region (nullptr parent op)' \n " ;
1695
+ << " ** Insert Block into detached Region (nullptr parent op)" ;
1683
1696
}
1697
+ if (wasDetached)
1698
+ logger.getOStream () << " (was detached)" ;
1699
+ logger.getOStream () << " \n " ;
1684
1700
});
1701
+ assert (!wasOpReplaced (newParentOp) &&
1702
+ " attempting to insert into a region within a replaced/erased op" );
1685
1703
1686
1704
patternInsertedBlocks.insert (block);
1687
1705
1688
- if (!previous) {
1689
- // This is a newly created block.
1706
+ if (wasDetached) {
1707
+ // If the block was detached, it is most likely a newly created block.
1708
+ // TODO: If the same block is inserted multiple times from a detached state,
1709
+ // the rollback mechanism may erase the same block multiple times. This is a
1710
+ // bug in the rollback-based dialect conversion driver.
1690
1711
appendRewrite<CreateBlockRewrite>(block);
1691
1712
return ;
1692
1713
}
1693
- Block *prevBlock = previousIt == previous->end () ? nullptr : &*previousIt;
1694
- appendRewrite<MoveBlockRewrite>(block, previous, prevBlock);
1714
+
1715
+ // The block was moved from one place to another.
1716
+ appendRewrite<MoveBlockRewrite>(block, previous, previousIt);
1695
1717
}
1696
1718
1697
1719
void ConversionPatternRewriterImpl::inlineBlockBefore (Block *source,
0 commit comments