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_KANAGAWAINLINESBLOCKS
29#include "circt/Dialect/Kanagawa/KanagawaPasses.h.inc"
35using namespace kanagawa;
39struct InlineSBlocksPass
40 :
public circt::kanagawa::impl::KanagawaInlineSBlocksBase<
42 void runOnOperation()
override;
45class InlineSBlocksPattern
53 matchAndRewrite(kanagawa::StaticBlockOp op, OpAdaptor adaptor,
54 ConversionPatternRewriter &rewriter)
const override {
55 Location loc = op.getLoc();
58 bool hasAttributes = !op->getAttrs().empty();
63 kanagawa::InlineStaticBlockBeginOp::create(rewriter, loc);
64 inlineStart->setAttrs(op->getAttrs());
68 Block *sblockBody = op.getBodyBlock();
69 BlockReturnOp ret = cast<BlockReturnOp>(sblockBody->getTerminator());
70 rewriter.inlineBlockBefore(sblockBody, op->getNextNode());
74 rewriter.replaceOp(op, ret.getRetValues());
78 rewriter.setInsertionPoint(ret);
79 kanagawa::InlineStaticBlockEndOp::create(rewriter, loc);
82 rewriter.eraseOp(ret);
89void InlineSBlocksPass::runOnOperation() {
90 MethodOp parent = getOperation();
91 ConversionTarget target(getContext());
92 target.addIllegalOp<kanagawa::StaticBlockOp>();
95 target.markUnknownOpDynamicallyLegal([](Operation *op) {
return true; });
96 RewritePatternSet
patterns(&getContext());
97 patterns.add<InlineSBlocksPattern>(&getContext());
99 if (failed(applyPartialConversion(parent, target, std::move(
patterns))))
100 return signalPassFailure();
104 return std::make_unique<InlineSBlocksPass>();
std::unique_ptr< mlir::Pass > createInlineSBlocksPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.