@@ -685,6 +685,33 @@ namespace {
685
685
// ===----------------------------------------------------------------------===//
686
686
// Region-Block Rewrite Testing
687
687
688
+ // / This pattern applies a signature conversion to a block inside a detached
689
+ // / region.
690
+ struct TestDetachedSignatureConversion : public ConversionPattern {
691
+ TestDetachedSignatureConversion (MLIRContext *ctx)
692
+ : ConversionPattern(" test.detached_signature_conversion" , /* benefit=*/ 1 ,
693
+ ctx) {}
694
+
695
+ LogicalResult
696
+ matchAndRewrite (Operation *op, ArrayRef<Value> operands,
697
+ ConversionPatternRewriter &rewriter) const final {
698
+ if (op->getNumRegions () != 1 )
699
+ return failure ();
700
+ OperationState state (op->getLoc (), " test.legal_op_with_region" , operands,
701
+ op->getResultTypes (), {}, BlockRange ());
702
+ Region *newRegion = state.addRegion ();
703
+ rewriter.inlineRegionBefore (op->getRegion (0 ), *newRegion,
704
+ newRegion->begin ());
705
+ TypeConverter::SignatureConversion result (newRegion->getNumArguments ());
706
+ for (unsigned i = 0 , e = newRegion->getNumArguments (); i < e; ++i)
707
+ result.addInputs (i, rewriter.getF64Type ());
708
+ rewriter.applySignatureConversion (&newRegion->front (), result);
709
+ Operation *newOp = rewriter.create (state);
710
+ rewriter.replaceOp (op, newOp->getResults ());
711
+ return success ();
712
+ }
713
+ };
714
+
688
715
// / This pattern is a simple pattern that inlines the first region of a given
689
716
// / operation into the parent region.
690
717
struct TestRegionRewriteBlockMovement : public ConversionPattern {
@@ -1112,16 +1139,16 @@ struct TestLegalizePatternDriver
1112
1139
TestTypeConverter converter;
1113
1140
mlir::RewritePatternSet patterns (&getContext ());
1114
1141
populateWithGenerated (patterns);
1115
- patterns
1116
- . add < TestRegionRewriteBlockMovement, TestRegionRewriteUndo ,
1117
- TestCreateBlock, TestCreateIllegalBlock, TestUndoBlockArgReplace ,
1118
- TestUndoBlockErase, TestPassthroughInvalidOp, TestSplitReturnType ,
1119
- TestChangeProducerTypeI32ToF32, TestChangeProducerTypeF32ToF64 ,
1120
- TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType ,
1121
- TestNonRootReplacement, TestBoundedRecursiveRewrite ,
1122
- TestNestedOpCreationUndoRewrite, TestReplaceEraseOp ,
1123
- TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1124
- TestUndoPropertiesModification>(&getContext ());
1142
+ patterns. add <
1143
+ TestRegionRewriteBlockMovement, TestDetachedSignatureConversion ,
1144
+ TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1145
+ TestUndoBlockArgReplace, TestUndoBlockErase, TestPassthroughInvalidOp,
1146
+ TestSplitReturnType, TestChangeProducerTypeI32ToF32 ,
1147
+ TestChangeProducerTypeF32ToF64, TestChangeProducerTypeF32ToInvalid ,
1148
+ TestUpdateConsumerType, TestNonRootReplacement ,
1149
+ TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite ,
1150
+ TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1151
+ TestUndoPropertiesModification>(&getContext ());
1125
1152
patterns.add <TestDropOpSignatureConversion>(&getContext (), converter);
1126
1153
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern (patterns,
1127
1154
converter);
@@ -1132,6 +1159,8 @@ struct TestLegalizePatternDriver
1132
1159
target.addLegalOp <ModuleOp>();
1133
1160
target.addLegalOp <LegalOpA, LegalOpB, LegalOpC, TestCastOp, TestValidOp,
1134
1161
TerminatorOp, OneRegionOp>();
1162
+ target.addLegalOp (
1163
+ OperationName (" test.legal_op_with_region" , &getContext ()));
1135
1164
target
1136
1165
.addIllegalOp <ILLegalOpF, TestRegionBuilderOp, TestOpWithRegionFold>();
1137
1166
target.addDynamicallyLegalOp <TestReturnOp>([](TestReturnOp op) {
0 commit comments