@@ -685,6 +685,35 @@ 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 ; i < newRegion->getNumArguments (); ++i) {
707
+ result.addInputs (i, rewriter.getF64Type ());
708
+ }
709
+ rewriter.applySignatureConversion (&newRegion->front (), result);
710
+ Operation *newOp = rewriter.create (state);
711
+ newOp->dump ();
712
+ rewriter.replaceOp (op, newOp->getResults ());
713
+ return success ();
714
+ }
715
+ };
716
+
688
717
// / This pattern is a simple pattern that inlines the first region of a given
689
718
// / operation into the parent region.
690
719
struct TestRegionRewriteBlockMovement : public ConversionPattern {
@@ -1112,16 +1141,16 @@ struct TestLegalizePatternDriver
1112
1141
TestTypeConverter converter;
1113
1142
mlir::RewritePatternSet patterns (&getContext ());
1114
1143
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 ());
1144
+ patterns. add <
1145
+ TestRegionRewriteBlockMovement, TestDetachedSignatureConversion ,
1146
+ TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1147
+ TestUndoBlockArgReplace, TestUndoBlockErase, TestPassthroughInvalidOp,
1148
+ TestSplitReturnType, TestChangeProducerTypeI32ToF32 ,
1149
+ TestChangeProducerTypeF32ToF64, TestChangeProducerTypeF32ToInvalid ,
1150
+ TestUpdateConsumerType, TestNonRootReplacement ,
1151
+ TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite ,
1152
+ TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1153
+ TestUndoPropertiesModification>(&getContext ());
1125
1154
patterns.add <TestDropOpSignatureConversion>(&getContext (), converter);
1126
1155
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern (patterns,
1127
1156
converter);
@@ -1132,6 +1161,8 @@ struct TestLegalizePatternDriver
1132
1161
target.addLegalOp <ModuleOp>();
1133
1162
target.addLegalOp <LegalOpA, LegalOpB, LegalOpC, TestCastOp, TestValidOp,
1134
1163
TerminatorOp, OneRegionOp>();
1164
+ target.addLegalOp (
1165
+ OperationName (" test.legal_op_with_region" , &getContext ()));
1135
1166
target
1136
1167
.addIllegalOp <ILLegalOpF, TestRegionBuilderOp, TestOpWithRegionFold>();
1137
1168
target.addDynamicallyLegalOp <TestReturnOp>([](TestReturnOp op) {
0 commit comments