Skip to content

Commit 99fade4

Browse files
committed
Fix CancelNestedInv pass
Before, the passes tried to delete the innerInvOp but this failed as they still used the innerInnerUnitary. Now, the innerInnerUnitary is cloned and the operation can be deleted (happens within the replaceOp(...)).
1 parent 31d1660 commit 99fade4

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

mlir/lib/Dialect/Flux/IR/Modifiers/InvOp.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ using namespace mlir::flux;
2929
namespace {
3030

3131
/**
32-
* @brief Cancel nested inverse modifiers, i.e., `inv(inv(x)) = x`.
32+
* @brief Cancel nested inverse modifiers, i.e., `inv(inv(x)) => x`.
3333
*/
3434
struct CancelNestedInv final : OpRewritePattern<InvOp> {
3535
using OpRewritePattern::OpRewritePattern;
@@ -44,8 +44,28 @@ struct CancelNestedInv final : OpRewritePattern<InvOp> {
4444

4545
// Remove both inverse operations
4646
auto innerInnerUnitary = innerInvOp.getBodyUnitary();
47-
rewriter.replaceOp(op, innerInnerUnitary.getOperation());
48-
rewriter.eraseOp(innerInvOp);
47+
auto* clonedOp = rewriter.clone(*innerInnerUnitary.getOperation());
48+
rewriter.replaceOp(op, clonedOp->getResults());
49+
50+
return success();
51+
}
52+
};
53+
54+
/**
55+
* @brief Reorder inverse and control modifiers, i.e., `inv(ctrl(x)) =>
56+
* ctrl(inv(x))`.
57+
*/
58+
struct ReorderInvCtrl final : OpRewritePattern<InvOp> {
59+
using OpRewritePattern::OpRewritePattern;
60+
61+
LogicalResult matchAndRewrite(InvOp op,
62+
PatternRewriter& rewriter) const override {
63+
auto ctrlOp = llvm::dyn_cast<CtrlOp>(op.getBodyUnitary().getOperation());
64+
if (!ctrlOp) {
65+
return failure();
66+
}
67+
68+
rewriter.replaceOp(op, ctrlOp);
4969

5070
return success();
5171
}
@@ -203,5 +223,5 @@ LogicalResult InvOp::verify() {
203223

204224
void InvOp::getCanonicalizationPatterns(RewritePatternSet& results,
205225
MLIRContext* context) {
206-
results.add<CancelNestedInv>(context);
226+
results.add<CancelNestedInv, ReorderInvCtrl>(context);
207227
}

mlir/lib/Dialect/Quartz/IR/Modifiers/InvOp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ using namespace mlir::quartz;
2727
namespace {
2828

2929
/**
30-
* @brief Cancel nested inverse modifiers.
30+
* @brief Cancel nested inverse modifiers, i.e., `inv(inv(x)) => x`.
3131
*/
3232
struct CancelNestedInv final : OpRewritePattern<InvOp> {
3333
using OpRewritePattern::OpRewritePattern;
@@ -40,8 +40,8 @@ struct CancelNestedInv final : OpRewritePattern<InvOp> {
4040
}
4141

4242
auto innerInnerUnitary = innerInvOp.getBodyUnitary();
43-
rewriter.replaceOp(invOp, innerInnerUnitary.getOperation());
44-
rewriter.eraseOp(innerInvOp);
43+
auto* clonedOp = rewriter.clone(*innerInnerUnitary.getOperation());
44+
rewriter.replaceOp(invOp, clonedOp->getResults());
4545

4646
return success();
4747
}

0 commit comments

Comments
 (0)