11 #include "mlir/Pass/Pass.h"
17 #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
19 #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
22 #include "mlir/Transforms/DialectConversion.h"
28 #define GEN_PASS_DEF_IBISINLINESBLOCKS
29 #include "circt/Dialect/Ibis/IbisPasses.h.inc"
34 using namespace circt;
39 struct InlineSBlocksPass
40 :
public circt::ibis::impl::IbisInlineSBlocksBase<InlineSBlocksPass> {
41 void runOnOperation()
override;
51 matchAndRewrite(ibis::StaticBlockOp op, OpAdaptor adaptor,
52 ConversionPatternRewriter &rewriter)
const override {
53 Location loc = op.getLoc();
56 bool hasAttributes = !op->getAttrs().empty();
60 auto inlineStart = rewriter.create<ibis::InlineStaticBlockBeginOp>(loc);
61 inlineStart->setAttrs(op->getAttrs());
65 Block *sblockBody = op.getBodyBlock();
66 BlockReturnOp ret = cast<BlockReturnOp>(sblockBody->getTerminator());
67 rewriter.inlineBlockBefore(sblockBody, op->getNextNode());
71 for (
auto [res, val] : llvm::zip(op.getResults(), ret.getRetValues()))
72 rewriter.replaceAllUsesWith(res, val);
76 rewriter.setInsertionPoint(ret);
77 rewriter.create<ibis::InlineStaticBlockEndOp>(loc);
80 rewriter.eraseOp(ret);
88 void InlineSBlocksPass::runOnOperation() {
89 MethodOp parent = getOperation();
90 ConversionTarget target(getContext());
91 target.addIllegalOp<ibis::StaticBlockOp>();
94 target.markUnknownOpDynamicallyLegal([](Operation *op) {
return true; });
95 RewritePatternSet
patterns(&getContext());
96 patterns.add<InlineSBlocksPattern>(&getContext());
98 if (failed(applyPartialConversion(parent, target, std::move(
patterns))))
99 return signalPassFailure();
103 return std::make_unique<InlineSBlocksPass>();
std::unique_ptr< mlir::Pass > createInlineSBlocksPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.