diff options
| author | River Riddle <riverriddle@google.com> | 2019-10-14 09:50:54 -0700 |
|---|---|---|
| committer | A. Unique TensorFlower <gardener@tensorflow.org> | 2019-10-14 10:01:59 -0700 |
| commit | 96de7091bcac2086fb3be55169ec4e826145c574 (patch) | |
| tree | a0d2050ec8bbecd70642ad82706241bdc72580b6 /mlir/test/lib/TestDialect | |
| parent | 24c392f21c6ea9d2e1dbe39728e8a2fddb25e740 (diff) | |
| download | bcm5719-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.td | 1 | ||||
| -rw-r--r-- | mlir/test/lib/TestDialect/TestPatterns.cpp | 26 |
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. |

