summaryrefslogtreecommitdiffstats
path: root/mlir/test/lib/TestDialect
diff options
context:
space:
mode:
authorRiver Riddle <riverriddle@google.com>2019-10-14 09:50:54 -0700
committerA. Unique TensorFlower <gardener@tensorflow.org>2019-10-14 10:01:59 -0700
commit96de7091bcac2086fb3be55169ec4e826145c574 (patch)
treea0d2050ec8bbecd70642ad82706241bdc72580b6 /mlir/test/lib/TestDialect
parent24c392f21c6ea9d2e1dbe39728e8a2fddb25e740 (diff)
downloadbcm5719-llvm-96de7091bcac2086fb3be55169ec4e826145c574.tar.gz
bcm5719-llvm-96de7091bcac2086fb3be55169ec4e826145c574.zip
Allowing replacing non-root operations in DialectConversion.
When dealing with regions, or other patterns that need to generate temporary operations, it is useful to be able to replace other operations than the root op being matched. Before this PR, these operations would still be considered for legalization meaning that the conversion would either fail, erroneously need to mark these ops as legal, or add unnecessary patterns. PiperOrigin-RevId: 274598513
Diffstat (limited to 'mlir/test/lib/TestDialect')
-rw-r--r--mlir/test/lib/TestDialect/TestOps.td1
-rw-r--r--mlir/test/lib/TestDialect/TestPatterns.cpp26
2 files changed, 24 insertions, 3 deletions
diff --git a/mlir/test/lib/TestDialect/TestOps.td b/mlir/test/lib/TestDialect/TestOps.td
index b26360f3d2c..73769e72a4a 100644
--- a/mlir/test/lib/TestDialect/TestOps.td
+++ b/mlir/test/lib/TestDialect/TestOps.td
@@ -808,6 +808,7 @@ def ILLegalOpE : TEST_Op<"illegal_op_e">, Results<(outs I32)>;
def ILLegalOpF : TEST_Op<"illegal_op_f">, Results<(outs I32)>;
def LegalOpA : TEST_Op<"legal_op_a">,
Arguments<(ins Test_LegalizerEnum:$status)>, Results<(outs I32)>;
+def LegalOpB : TEST_Op<"legal_op_b">, Results<(outs I32)>;
// Check that smaller pattern depths are chosen, i.e. prioritize more direct
// mappings.
diff --git a/mlir/test/lib/TestDialect/TestPatterns.cpp b/mlir/test/lib/TestDialect/TestPatterns.cpp
index 83814eed11c..2dde6a37675 100644
--- a/mlir/test/lib/TestDialect/TestPatterns.cpp
+++ b/mlir/test/lib/TestDialect/TestPatterns.cpp
@@ -249,6 +249,26 @@ struct TestUpdateConsumerType : public ConversionPattern {
}
};
+//===----------------------------------------------------------------------===//
+// Non-Root Replacement Rewrite Testing
+/// This pattern generates an invalid operation, but replaces it before the
+/// pattern is finished. This checks that we don't need to legalize the
+/// temporary op.
+struct TestNonRootReplacement : public RewritePattern {
+ TestNonRootReplacement(MLIRContext *ctx)
+ : RewritePattern("test.replace_non_root", 1, ctx) {}
+
+ PatternMatchResult matchAndRewrite(Operation *op,
+ PatternRewriter &rewriter) const final {
+ auto resultType = *op->result_type_begin();
+ auto illegalOp = rewriter.create<ILLegalOpF>(op->getLoc(), resultType);
+ auto legalOp = rewriter.create<LegalOpB>(op->getLoc(), resultType);
+
+ rewriter.replaceOp(illegalOp, {legalOp});
+ rewriter.replaceOp(op, {illegalOp});
+ return matchSuccess();
+ }
+};
} // namespace
namespace {
@@ -301,15 +321,15 @@ struct TestLegalizePatternDriver
.insert<TestRegionRewriteBlockMovement, TestRegionRewriteUndo,
TestDropOp, TestPassthroughInvalidOp, TestSplitReturnType,
TestChangeProducerTypeI32ToF32, TestChangeProducerTypeF32ToF64,
- TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType>(
- &getContext());
+ TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType,
+ TestNonRootReplacement>(&getContext());
mlir::populateFuncOpTypeConversionPattern(patterns, &getContext(),
converter);
// Define the conversion target used for the test.
ConversionTarget target(getContext());
target.addLegalOp<ModuleOp, ModuleTerminatorOp>();
- target.addLegalOp<LegalOpA, TestCastOp, TestValidOp>();
+ target.addLegalOp<LegalOpA, LegalOpB, TestCastOp, TestValidOp>();
target.addIllegalOp<ILLegalOpF, TestRegionBuilderOp>();
target.addDynamicallyLegalOp<TestReturnOp>([](TestReturnOp op) {
// Don't allow F32 operands.
OpenPOWER on IntegriCloud