Skip to content

Commit f3fe2f1

Browse files
[mlir][Transforms] Make ConversionPatternRewriter constructor private
`ConversionPatternRewriter` objects should not be constructed outside of dialect conversions. Some IR modifications performed through a `ConversionPatternRewriter` are reflected in the IR in a delayed fashion (e.g., only when the dialect conversion is guaranteed to succeed). Using a `ConversionPatternRewriter` outside of the dialect conversion is incorrect API usage and can bring the IR in an inconsistent state. Migration guide: Use `IRRewriter` instead of `ConversionPatternRewriter`.
1 parent 51a7e12 commit f3fe2f1

File tree

3 files changed

+21
-9
lines changed

3 files changed

+21
-9
lines changed

flang/lib/Frontend/FrontendActions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ static void addAMDGPUSpecificMLIRItems(mlir::ModuleOp &mlirModule,
177177
return;
178178
}
179179

180-
mlir::ConversionPatternRewriter builder(mlirModule.getContext());
180+
mlir::IRRewriter builder(mlirModule.getContext());
181181
unsigned oclcABIVERsion = codeGenOpts.CodeObjectVersion;
182182
auto int32Type = builder.getI32Type();
183183

mlir/include/mlir/Transforms/DialectConversion.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Block;
2727
class ConversionPatternRewriter;
2828
class MLIRContext;
2929
class Operation;
30+
struct OperationConverter;
3031
class Type;
3132
class Value;
3233

@@ -657,7 +658,6 @@ struct ConversionPatternRewriterImpl;
657658
/// hooks.
658659
class ConversionPatternRewriter final : public PatternRewriter {
659660
public:
660-
explicit ConversionPatternRewriter(MLIRContext *ctx);
661661
~ConversionPatternRewriter() override;
662662

663663
/// Apply a signature conversion to the entry block of the given region. This
@@ -764,6 +764,14 @@ class ConversionPatternRewriter final : public PatternRewriter {
764764
detail::ConversionPatternRewriterImpl &getImpl();
765765

766766
private:
767+
// Allow OperationConverter to construct new rewriters.
768+
friend struct OperationConverter;
769+
770+
/// Conversion pattern rewriters must not be used outside of dialect
771+
/// conversions. They apply some IR rewrites in a delayed fashion and could
772+
/// bring the IR into an inconsistent state when used standalone.
773+
explicit ConversionPatternRewriter(MLIRContext *ctx);
774+
767775
// Hide unsupported pattern rewriter API.
768776
using OpBuilder::setListener;
769777

mlir/lib/Transforms/Utils/DialectConversion.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,11 @@ class ReplaceOperationRewrite : public OperationRewrite {
594594

595595
void cleanup() override;
596596

597-
private:
598-
friend struct OperationConverter;
597+
const TypeConverter *getConverter() const { return converter; }
598+
599+
bool hasChangedResults() const { return changedResults; }
599600

601+
private:
600602
/// An optional type converter that can be used to materialize conversions
601603
/// between the new and old values if necessary.
602604
const TypeConverter *converter;
@@ -2354,7 +2356,9 @@ enum OpConversionMode {
23542356
/// applied to the operations on success.
23552357
Analysis,
23562358
};
2359+
} // namespace
23572360

2361+
namespace mlir {
23582362
// This class converts operations to a given conversion target via a set of
23592363
// rewrite patterns. The conversion behaves differently depending on the
23602364
// conversion mode.
@@ -2414,7 +2418,7 @@ struct OperationConverter {
24142418
/// *not* to be legalizable to the target.
24152419
DenseSet<Operation *> *trackedOps;
24162420
};
2417-
} // namespace
2421+
} // namespace mlir
24182422

24192423
LogicalResult OperationConverter::convert(ConversionPatternRewriter &rewriter,
24202424
Operation *op) {
@@ -2506,7 +2510,7 @@ OperationConverter::finalize(ConversionPatternRewriter &rewriter) {
25062510
for (unsigned i = 0; i < rewriterImpl.rewrites.size(); ++i) {
25072511
auto *opReplacement =
25082512
dyn_cast<ReplaceOperationRewrite>(rewriterImpl.rewrites[i].get());
2509-
if (!opReplacement || !opReplacement->changedResults)
2513+
if (!opReplacement || !opReplacement->hasChangedResults())
25102514
continue;
25112515
Operation *op = opReplacement->getOperation();
25122516
for (OpResult result : op->getResults()) {
@@ -2530,9 +2534,9 @@ OperationConverter::finalize(ConversionPatternRewriter &rewriter) {
25302534

25312535
// Legalize this result.
25322536
rewriter.setInsertionPoint(op);
2533-
if (failed(legalizeChangedResultType(op, result, newValue,
2534-
opReplacement->converter, rewriter,
2535-
rewriterImpl, *inverseMapping)))
2537+
if (failed(legalizeChangedResultType(
2538+
op, result, newValue, opReplacement->getConverter(), rewriter,
2539+
rewriterImpl, *inverseMapping)))
25362540
return failure();
25372541
}
25382542
}

0 commit comments

Comments
 (0)