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>()) {
43 llvm::make_early_inc_range(fileOp.getOps<
emit::RefOp>())) {
44 auto testOp = symTbl.lookup<TestOp>(refOp.getTargetAttr().getAttr());
46 refOp.emitError(
"invalid symbol reference: ") << refOp.getTargetAttr();
47 return signalPassFailure();
51 llvm::all_of(testOp.getBody()->getArguments(),
52 [](
auto arg) { return arg.use_empty(); });
54 testOp->emitError(
"cannot inline test with used arguments");
55 return signalPassFailure();
58 testOp.getBody()->eraseArguments(0, testOp.getBody()->getNumArguments());
59 rewriter.setInsertionPoint(refOp);
60 CommentOp::create(rewriter, refOp->getLoc(),
61 rewriter.getStringAttr(
"Begin of test '" +
62 testOp.getSymName() +
"'"));
63 auto newTestOp = cast<TestOp>(testOp->clone());
64 rewriter.inlineBlockBefore(newTestOp.getBody(), refOp, {});
66 rewriter, refOp->getLoc(),
67 rewriter.getStringAttr(
"End of test '" + testOp.getSymName() +
"'"));
73 for (
auto &op :
llvm::make_early_inc_range(getOperation().getOps()))
74 if (isa<TargetOp, TestOp>(&op))
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.