[mlir][NFC] Avoid OpBuilder::setListener when possible

`setListener` is dangerous because an already registered listener may accidentally be overwritten/replaced. (A `ForwardingListener` must be used in such cases.) This change updates a few trivial call sites of `setListener`, where no forwarding listener is needed.

Differential Revision: https://reviews.llvm.org/D155599
This commit is contained in:
Matthias Springer
2023-07-19 08:59:02 +02:00
parent 7ee94d7167
commit 9d072bbe0f
4 changed files with 19 additions and 21 deletions

View File

@@ -151,7 +151,9 @@ protected:
/// 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

View File

@@ -44,8 +44,7 @@ class ExpandIfCondition : public OpRewritePattern<OpTy> {
auto ifOp = rewriter.create<scf::IfOp>(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 {

View File

@@ -1278,17 +1278,16 @@ mlir::affine::makeComposedFoldedAffineApply(OpBuilder &b, Location loc,
ArrayRef<OpFoldResult> 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.getContext());
newBuilder.setInsertionPoint(b.getInsertionBlock(), b.getInsertionPoint());
// Create op.
AffineApplyOp applyOp = makeComposedAffineApply(b, loc, map, operands);
AffineApplyOp applyOp =
makeComposedAffineApply(newBuilder, loc, map, operands);
// Get constant operands.
SmallVector<Attribute> constOperands(applyOp->getNumOperands());
@@ -1299,7 +1298,7 @@ mlir::affine::makeComposedFoldedAffineApply(OpBuilder &b, Location loc,
SmallVector<OpFoldResult> 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 +1346,15 @@ template <typename OpTy>
static OpFoldResult makeComposedFoldedMinMax(OpBuilder &b, Location loc,
AffineMap map,
ArrayRef<OpFoldResult> 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.getContext());
newBuilder.setInsertionPoint(b.getInsertionBlock(), b.getInsertionPoint());
// Create op.
auto minMaxOp = makeComposedMinMax<OpTy>(b, loc, map, operands);
auto minMaxOp = makeComposedMinMax<OpTy>(newBuilder, loc, map, operands);
// Get constant operands.
SmallVector<Attribute> constOperands(minMaxOp->getNumOperands());
@@ -1368,7 +1365,7 @@ static OpFoldResult makeComposedFoldedMinMax(OpBuilder &b, Location loc,
SmallVector<OpFoldResult> foldResults;
if (failed(minMaxOp->fold(constOperands, foldResults)) ||
foldResults.empty()) {
if (listener)
if (OpBuilder::Listener *listener = b.getListener())
listener->notifyOperationInserted(minMaxOp);
return minMaxOp.getResult();
}

View File

@@ -289,9 +289,9 @@ OneToNConversionPattern::matchAndRewrite(Operation *op,
// 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,