16 #include "mlir/Transforms/DialectConversion.h"
18 using namespace circt;
25 using ValueMapping = llvm::MapVector<Value, llvm::SmallVector<OpOperand *>>;
29 static void getExternallyDefinedOperands(StaticBlockOp blockOp,
30 ValueMapping &mapping) {
31 Block *blockBodyBlock = blockOp.getBodyBlock();
32 for (Operation &op : *blockBodyBlock) {
33 for (OpOperand &operand : op.getOpOperands()) {
34 Value v = operand.get();
35 if (v.getParentBlock() != blockBodyBlock)
36 mapping[v].push_back(&operand);
45 matchAndRewrite(StaticBlockOp blockOp, OpAdaptor adaptor,
46 ConversionPatternRewriter &rewriter)
const override {
48 getExternallyDefinedOperands(blockOp, mapping);
49 Block *bodyBlock = blockOp.getBodyBlock();
51 auto isolatedBlock = rewriter.create<IsolatedStaticBlockOp>(
52 blockOp.getLoc(), blockOp.getResultTypes(), blockOp.getOperands(),
53 blockOp.getMaxThreadsAttr());
55 Block *isolatedBlockBody = isolatedBlock.getBodyBlock();
56 rewriter.eraseOp(isolatedBlockBody->getTerminator());
57 llvm::SmallVector<Value> preAddBArgs;
58 llvm::copy(blockOp.getBodyBlock()->getArguments(),
59 std::back_inserter(preAddBArgs));
63 for (
auto &[value, uses] : mapping) {
64 isolatedBlock.getInputsMutable().append({value});
66 isolatedBlockBody->addArgument(value.getType(), value.getLoc());
67 for (OpOperand *operand : uses)
71 rewriter.mergeBlocks(bodyBlock, isolatedBlockBody, preAddBArgs);
72 rewriter.replaceOp(blockOp, isolatedBlock.getResults());
77 struct ArgifyBlocksPass :
public IbisArgifyBlocksBase<ArgifyBlocksPass> {
78 void runOnOperation()
override;
82 void ArgifyBlocksPass::runOnOperation() {
83 auto *ctx = &getContext();
84 ConversionTarget target(*ctx);
85 target.addIllegalOp<StaticBlockOp>();
86 target.addLegalDialect<IbisDialect>();
89 patterns.add<BlockConversionPattern>(ctx);
92 applyPartialConversion(getOperation(), target, std::move(
patterns))))
97 return std::make_unique<ArgifyBlocksPass>();
std::unique_ptr< mlir::Pass > createArgifyBlocksPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.