diff --git a/mlir/include/mlir/Transforms/OneToNTypeConversion.h b/mlir/include/mlir/Transforms/OneToNTypeConversion.h --- a/mlir/include/mlir/Transforms/OneToNTypeConversion.h +++ b/mlir/include/mlir/Transforms/OneToNTypeConversion.h @@ -151,7 +151,9 @@ /// conversions. class OneToNPatternRewriter : public PatternRewriter { public: - OneToNPatternRewriter(MLIRContext *context) : PatternRewriter(context) {} + OneToNPatternRewriter(MLIRContext *context, + OpBuilder::Listener *listener = nullptr) + : PatternRewriter(context, listener) {} /// Replaces the results of the operation with the specified list of values /// mapped back to the original types as specified in the provided type diff --git a/mlir/lib/Conversion/OpenACCToSCF/OpenACCToSCF.cpp b/mlir/lib/Conversion/OpenACCToSCF/OpenACCToSCF.cpp --- a/mlir/lib/Conversion/OpenACCToSCF/OpenACCToSCF.cpp +++ b/mlir/lib/Conversion/OpenACCToSCF/OpenACCToSCF.cpp @@ -44,8 +44,7 @@ auto ifOp = rewriter.create(op.getLoc(), TypeRange(), op.getIfCond(), false); rewriter.updateRootInPlace(op, [&]() { op.getIfCondMutable().erase(0); }); - auto thenBodyBuilder = ifOp.getThenBodyBuilder(); - thenBodyBuilder.setListener(rewriter.getListener()); + auto thenBodyBuilder = ifOp.getThenBodyBuilder(rewriter.getListener()); thenBodyBuilder.clone(*op.getOperation()); rewriter.eraseOp(op); } else { diff --git a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp --- a/mlir/lib/Dialect/Affine/IR/AffineOps.cpp +++ b/mlir/lib/Dialect/Affine/IR/AffineOps.cpp @@ -1278,17 +1278,15 @@ ArrayRef operands) { assert(map.getNumResults() == 1 && "building affine.apply with !=1 result"); - // Temporarily disconnect the listener, so that no notification is triggered - // if the op is folded. + // Create new builder without a listener, so that no notification is + // triggered if the op is folded. // TODO: OpBuilder::createOrFold should return OpFoldResults, then this // workaround is no longer needed. - OpBuilder::Listener *listener = b.getListener(); - b.setListener(nullptr); - auto listenerResetter = - llvm::make_scope_exit([listener, &b] { b.setListener(listener); }); + OpBuilder newBuilder(b.getInsertionBlock(), b.getInsertionPoint()); // Create op. - AffineApplyOp applyOp = makeComposedAffineApply(b, loc, map, operands); + AffineApplyOp applyOp = + makeComposedAffineApply(newBuilder, loc, map, operands); // Get constant operands. SmallVector constOperands(applyOp->getNumOperands()); @@ -1299,7 +1297,7 @@ SmallVector foldResults; if (failed(applyOp->fold(constOperands, foldResults)) || foldResults.empty()) { - if (listener) + if (OpBuilder::Listener *listener = b.getListener()) listener->notifyOperationInserted(applyOp); return applyOp.getResult(); } @@ -1347,17 +1345,14 @@ static OpFoldResult makeComposedFoldedMinMax(OpBuilder &b, Location loc, AffineMap map, ArrayRef operands) { - // Temporarily disconnect the listener, so that no notification is triggered - // if the op is folded. + // Create new builder without a listener, so that no notification is + // triggered if the op is folded. // TODO: OpBuilder::createOrFold should return OpFoldResults, then this // workaround is no longer needed. - OpBuilder::Listener *listener = b.getListener(); - b.setListener(nullptr); - auto listenerResetter = - llvm::make_scope_exit([listener, &b] { b.setListener(listener); }); + OpBuilder newBuilder(b.getInsertionBlock(), b.getInsertionPoint()); // Create op. - auto minMaxOp = makeComposedMinMax(b, loc, map, operands); + auto minMaxOp = makeComposedMinMax(newBuilder, loc, map, operands); // Get constant operands. SmallVector constOperands(minMaxOp->getNumOperands()); @@ -1368,7 +1363,7 @@ SmallVector foldResults; if (failed(minMaxOp->fold(constOperands, foldResults)) || foldResults.empty()) { - if (listener) + if (OpBuilder::Listener *listener = b.getListener()) listener->notifyOperationInserted(minMaxOp); return minMaxOp.getResult(); } diff --git a/mlir/lib/Transforms/Utils/OneToNTypeConversion.cpp b/mlir/lib/Transforms/Utils/OneToNTypeConversion.cpp --- a/mlir/lib/Transforms/Utils/OneToNTypeConversion.cpp +++ b/mlir/lib/Transforms/Utils/OneToNTypeConversion.cpp @@ -289,9 +289,9 @@ // drive the pattern application ourselves, which is a lot // of additional boilerplate code. This seems to work fine, // so I leave it like this for the time being. - OneToNPatternRewriter oneToNPatternRewriter(rewriter.getContext()); + OneToNPatternRewriter oneToNPatternRewriter(rewriter.getContext(), + rewriter.getListener()); oneToNPatternRewriter.restoreInsertionPoint(rewriter.saveInsertionPoint()); - oneToNPatternRewriter.setListener(rewriter.getListener()); // Apply actual pattern. if (failed(matchAndRewrite(op, oneToNPatternRewriter, operandMapping,