12#include "mlir/IR/PatternMatch.h"
16#define GEN_PASS_DEF_SIMPLETESTINLINERPASS
17#include "circt/Dialect/RTG/Transforms/RTGPasses.h.inc"
30struct SimpleTestInlinerPass
31 :
public rtg::impl::SimpleTestInlinerPassBase<SimpleTestInlinerPass> {
33 void runOnOperation()
override;
37void SimpleTestInlinerPass::runOnOperation() {
38 const auto &symTbl = getAnalysis<SymbolTable>();
39 IRRewriter rewriter(getOperation());
41 for (
auto fileOp : getOperation().getOps<
emit::FileOp>()) {
42 rewriter.setInsertionPointToStart(fileOp.getBody());
44 SegmentOp::create(rewriter, fileOp->getLoc(), SegmentKind::Text);
45 segOp.getBodyRegion().emplaceBlock();
47 Block *fileBlock = fileOp.getBody();
48 Block *segBlock = segOp.getBody();
50 auto opsToMove = llvm::make_early_inc_range(
51 llvm::make_range(std::next(fileBlock->begin()), fileBlock->end()));
52 for (
auto &op : opsToMove)
53 op.moveBefore(segBlock, segBlock->
end());
55 for (
auto refOp :
llvm::make_early_inc_range(segOp.getOps<
emit::RefOp>())) {
56 auto testOp = symTbl.lookup<TestOp>(refOp.getTargetAttr().getAttr());
58 refOp.emitError(
"invalid symbol reference: ") << refOp.getTargetAttr();
59 return signalPassFailure();
63 llvm::all_of(testOp.getBody()->getArguments(),
64 [](
auto arg) { return arg.use_empty(); });
66 testOp->emitError(
"cannot inline test with used arguments");
67 return signalPassFailure();
70 testOp.getBody()->eraseArguments(0, testOp.getBody()->getNumArguments());
71 rewriter.setInsertionPoint(refOp);
72 auto testBeginComment = ConstantOp::create(
73 rewriter, refOp->getLoc(),
74 StringAttr::get(Twine(
"Begin of test '") + testOp.getSymName() +
"'",
75 StringType::get(rewriter.getContext())));
76 CommentOp::create(rewriter, refOp->getLoc(), testBeginComment);
77 auto newTestOp = cast<TestOp>(testOp->clone());
78 rewriter.inlineBlockBefore(newTestOp.getBody(), refOp, {});
79 auto testEndComment = ConstantOp::create(
80 rewriter, refOp->getLoc(),
81 StringAttr::get(Twine(
"End of test '") + testOp.getSymName() +
"'",
82 StringType::get(rewriter.getContext())));
83 CommentOp::create(rewriter, refOp->getLoc(), testEndComment);
89 for (
auto &op :
llvm::make_early_inc_range(getOperation().getOps()))
90 if (isa<TargetOp, TestOp>(&op))
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.