15 #include "mlir/Transforms/GreedyPatternRewriteDriver.h"
17 #include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
20 #include "mlir/Transforms/DialectConversion.h"
25 using namespace circt;
30 struct InlineSBlocksPass :
public IbisInlineSBlocksBase<InlineSBlocksPass> {
31 void runOnOperation()
override;
41 matchAndRewrite(ibis::StaticBlockOp op, OpAdaptor adaptor,
42 ConversionPatternRewriter &rewriter)
const override {
43 Location loc = op.getLoc();
46 bool hasAttributes = !op->getAttrs().empty();
50 auto inlineStart = rewriter.create<ibis::InlineStaticBlockBeginOp>(loc);
51 inlineStart->setAttrs(op->getAttrs());
55 Block *sblockBody = op.getBodyBlock();
56 BlockReturnOp ret = cast<BlockReturnOp>(sblockBody->getTerminator());
57 rewriter.inlineBlockBefore(sblockBody, op->getNextNode());
61 for (
auto [res, val] : llvm::zip(op.getResults(), ret.getRetValues()))
62 rewriter.replaceAllUsesWith(res, val);
66 rewriter.setInsertionPoint(ret);
67 rewriter.create<ibis::InlineStaticBlockEndOp>(loc);
70 rewriter.eraseOp(ret);
78 void InlineSBlocksPass::runOnOperation() {
79 MethodOp parent = getOperation();
80 ConversionTarget target(getContext());
81 target.addIllegalOp<ibis::StaticBlockOp>();
84 target.markUnknownOpDynamicallyLegal([](Operation *op) {
return true; });
85 RewritePatternSet
patterns(&getContext());
86 patterns.add<InlineSBlocksPattern>(&getContext());
88 if (failed(applyPartialConversion(parent, target, std::move(
patterns))))
89 return signalPassFailure();
93 return std::make_unique<InlineSBlocksPass>();
std::unique_ptr< mlir::Pass > createInlineSBlocksPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.