@@ -1193,22 +1193,31 @@ class TestEraseOp : public ConversionPattern {
11931193 }
11941194};
11951195
1196- // / This pattern matches a test.duplicate_block_args op and duplicates all
1197- // / block arguments.
1198- class TestDuplicateBlockArgs
1199- : public OpConversionPattern<DuplicateBlockArgsOp> {
1200- using OpConversionPattern<DuplicateBlockArgsOp>::OpConversionPattern;
1196+ // / This pattern matches a test.convert_block_args op. It either:
1197+ // / a) Duplicates all block arguments,
1198+ // / b) or: drops all block arguments and replaces each with 2x the first
1199+ // / operand.
1200+ class TestConvertBlockArgs : public OpConversionPattern <ConvertBlockArgsOp> {
1201+ using OpConversionPattern<ConvertBlockArgsOp>::OpConversionPattern;
12011202
12021203 LogicalResult
1203- matchAndRewrite (DuplicateBlockArgsOp op, OpAdaptor adaptor,
1204+ matchAndRewrite (ConvertBlockArgsOp op, OpAdaptor adaptor,
12041205 ConversionPatternRewriter &rewriter) const override {
12051206 if (op.getIsLegal ())
12061207 return failure ();
1207- rewriter.startOpModification (op);
12081208 Block *body = &op.getBody ().front ();
12091209 TypeConverter::SignatureConversion result (body->getNumArguments ());
1210- for (auto it : llvm::enumerate (body->getArgumentTypes ()))
1211- result.addInputs (it.index (), {it.value (), it.value ()});
1210+ for (auto it : llvm::enumerate (body->getArgumentTypes ())) {
1211+ if (op.getReplaceWithOperand ()) {
1212+ result.remapInput (it.index (), {adaptor.getVal (), adaptor.getVal ()});
1213+ } else if (op.getDuplicate ()) {
1214+ result.addInputs (it.index (), {it.value (), it.value ()});
1215+ } else {
1216+ // No action specified. Pattern does not apply.
1217+ return failure ();
1218+ }
1219+ }
1220+ rewriter.startOpModification (op);
12121221 rewriter.applySignatureConversion (body, result, getTypeConverter ());
12131222 op.setIsLegal (true );
12141223 rewriter.finalizeOpModification (op);
@@ -1355,7 +1364,7 @@ struct TestLegalizePatternDriver
13551364 patterns.add <TestDropOpSignatureConversion, TestDropAndReplaceInvalidOp,
13561365 TestPassthroughInvalidOp, TestMultiple1ToNReplacement>(
13571366 &getContext (), converter);
1358- patterns.add <TestDuplicateBlockArgs >(converter, &getContext ());
1367+ patterns.add <TestConvertBlockArgs >(converter, &getContext ());
13591368 mlir::populateAnyFunctionOpInterfaceTypeConversionPattern (patterns,
13601369 converter);
13611370 mlir::populateCallOpTypeConversionPattern (patterns, converter);
@@ -1406,8 +1415,8 @@ struct TestLegalizePatternDriver
14061415 target.addDynamicallyLegalOp <TestOpInPlaceSelfFold>(
14071416 [](TestOpInPlaceSelfFold op) { return op.getFolded (); });
14081417
1409- target.addDynamicallyLegalOp <DuplicateBlockArgsOp >(
1410- [](DuplicateBlockArgsOp op) { return op.getIsLegal (); });
1418+ target.addDynamicallyLegalOp <ConvertBlockArgsOp >(
1419+ [](ConvertBlockArgsOp op) { return op.getIsLegal (); });
14111420
14121421 // Handle a partial conversion.
14131422 if (mode == ConversionMode::Partial) {
0 commit comments