@@ -891,20 +891,25 @@ struct TestCreateIllegalBlock : public RewritePattern {
891
891
}
892
892
};
893
893
894
- // / A simple pattern that tests the undo mechanism when replacing the uses of a
895
- // / block argument.
896
- struct TestUndoBlockArgReplace : public ConversionPattern {
897
- TestUndoBlockArgReplace (MLIRContext *ctx)
898
- : ConversionPattern( " test.undo_block_arg_replace " , /* benefit= */ 1 , ctx) {}
894
+ // / A simple pattern that tests the "replaceUsesOfBlockArgument" API.
895
+ struct TestBlockArgReplace : public ConversionPattern {
896
+ TestBlockArgReplace (MLIRContext *ctx, const TypeConverter &converter)
897
+ : ConversionPattern(converter, " test.block_arg_replace " , /* benefit= */ 1 ,
898
+ ctx) {}
899
899
900
900
LogicalResult
901
901
matchAndRewrite (Operation *op, ArrayRef<Value> operands,
902
902
ConversionPatternRewriter &rewriter) const final {
903
- auto illegalOp =
904
- rewriter. create <ILLegalOpF>( op->getLoc (), rewriter. getF32Type () );
903
+ // Replace the first block argument with 2x the second block argument.
904
+ Value repl = op->getRegion ( 0 ). getArgument ( 1 );
905
905
rewriter.replaceUsesOfBlockArgument (op->getRegion (0 ).getArgument (0 ),
906
- illegalOp->getResult (0 ));
907
- rewriter.modifyOpInPlace (op, [] {});
906
+ {repl, repl});
907
+ rewriter.modifyOpInPlace (op, [&] {
908
+ // If the "trigger_rollback" attribute is set, keep the op illegal, so
909
+ // that a rollback is triggered.
910
+ if (!op->hasAttr (" trigger_rollback" ))
911
+ op->setAttr (" is_legal" , rewriter.getUnitAttr ());
912
+ });
908
913
return success ();
909
914
}
910
915
};
@@ -1375,20 +1380,19 @@ struct TestLegalizePatternDriver
1375
1380
TestTypeConverter converter;
1376
1381
mlir::RewritePatternSet patterns (&getContext ());
1377
1382
populateWithGenerated (patterns);
1378
- patterns
1379
- .add <TestRegionRewriteBlockMovement, TestDetachedSignatureConversion,
1380
- TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1381
- TestUndoBlockArgReplace, TestUndoBlockErase, TestSplitReturnType,
1382
- TestChangeProducerTypeI32ToF32, TestChangeProducerTypeF32ToF64,
1383
- TestChangeProducerTypeF32ToInvalid, TestUpdateConsumerType,
1384
- TestNonRootReplacement, TestBoundedRecursiveRewrite,
1385
- TestNestedOpCreationUndoRewrite, TestReplaceEraseOp,
1386
- TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1387
- TestUndoPropertiesModification, TestEraseOp,
1388
- TestRepetitive1ToNConsumer>(&getContext ());
1383
+ patterns.add <
1384
+ TestRegionRewriteBlockMovement, TestDetachedSignatureConversion,
1385
+ TestRegionRewriteUndo, TestCreateBlock, TestCreateIllegalBlock,
1386
+ TestUndoBlockErase, TestSplitReturnType, TestChangeProducerTypeI32ToF32,
1387
+ TestChangeProducerTypeF32ToF64, TestChangeProducerTypeF32ToInvalid,
1388
+ TestUpdateConsumerType, TestNonRootReplacement,
1389
+ TestBoundedRecursiveRewrite, TestNestedOpCreationUndoRewrite,
1390
+ TestReplaceEraseOp, TestCreateUnregisteredOp, TestUndoMoveOpBefore,
1391
+ TestUndoPropertiesModification, TestEraseOp,
1392
+ TestRepetitive1ToNConsumer>(&getContext ());
1389
1393
patterns.add <TestDropOpSignatureConversion, TestDropAndReplaceInvalidOp,
1390
- TestPassthroughInvalidOp, TestMultiple1ToNReplacement>(
1391
- &getContext (), converter);
1394
+ TestPassthroughInvalidOp, TestMultiple1ToNReplacement,
1395
+ TestBlockArgReplace>( &getContext (), converter);
1392
1396
patterns.add <TestConvertBlockArgs>(converter, &getContext ());
1393
1397
mlir::populateAnyFunctionOpInterfaceTypeConversionPattern (patterns,
1394
1398
converter);
@@ -1413,6 +1417,9 @@ struct TestLegalizePatternDriver
1413
1417
});
1414
1418
target.addDynamicallyLegalOp <func::CallOp>(
1415
1419
[&](func::CallOp op) { return converter.isLegal (op); });
1420
+ target.addDynamicallyLegalOp (
1421
+ OperationName (" test.block_arg_replace" , &getContext ()),
1422
+ [](Operation *op) { return op->hasAttr (" is_legal" ); });
1416
1423
1417
1424
// TestCreateUnregisteredOp creates `arith.constant` operation,
1418
1425
// which was not added to target intentionally to test
0 commit comments