diff --git a/include/ep2/dialect/Passes.h b/include/ep2/dialect/Passes.h index 0e8faec..051d9b1 100644 --- a/include/ep2/dialect/Passes.h +++ b/include/ep2/dialect/Passes.h @@ -68,7 +68,7 @@ struct HandlerDependencyAnalysis { friend bool operator<(const HandlerFullName &l, const HandlerFullName &r) { return std::tie(l.event, l.atom) < std::tie(r.event, r.atom); } - std::string mangle() const { + std::string mangle() const { auto surffix = atom == "" ? "" : "_" + atom; return ("__handler_" + event + surffix).str(); } @@ -77,7 +77,9 @@ struct HandlerDependencyAnalysis { return (event + surffix).str(); } - HandlerFullName(std::string event, std::string atom = "") : event(event), atom(atom) {} + // NOTE: This constructor stores StringRefs that point into the provided + // StringRefs. Callers must ensure the underlying data outlives this object. + HandlerFullName(llvm::StringRef event, llvm::StringRef atom = "") : event(event), atom(atom) {} HandlerFullName(FuncOp funcOp); HandlerFullName(ReturnOp returnOp); HandlerFullName(InitOp initOp); diff --git a/lib/ep2/HandlerReplicationPass.cpp b/lib/ep2/HandlerReplicationPass.cpp index 798c89d..dc6339e 100644 --- a/lib/ep2/HandlerReplicationPass.cpp +++ b/lib/ep2/HandlerReplicationPass.cpp @@ -68,10 +68,10 @@ void HandlerReplicationPass::runOnOperation() { is replicated onto island 1, compute units 1,2 then location on handler 1 = i1cu1, handler 2 has i1cu2. */ + std::vector toErase; module->walk([&](ep2::FuncOp funcOp) { if (funcOp->getAttr("type").cast().getValue() == "handler" && !funcOp.isExtern()) { parentBlock = funcOp->getBlock(); - llvm::errs() << funcOp.getSymName().str() << '\n'; auto instances = cast(funcOp->getAttr("instances")).getValue(); int sz = instances.size(); mlir::Operation::CloneOptions options(true, true); @@ -80,13 +80,16 @@ void HandlerReplicationPass::runOnOperation() { for (int i = 1; i<=sz; ++i) { mlir::Operation* cloneOp = funcOp->clone(options); cloneOp->setAttr("location", instances[i-1]); - + cast(cloneOp).setSymName(name + "_" + std::to_string(i)); toInsert.push_back(cloneOp); } - funcOp->erase(); + toErase.push_back(funcOp); } }); + for (auto funcOp : toErase) { + funcOp->erase(); + } for (mlir::Operation* op : toInsert) { parentBlock->push_back(op); } diff --git a/lib/ep2/Passes/GlobalToPartitionPass.cpp b/lib/ep2/Passes/GlobalToPartitionPass.cpp index 80103c2..3e68444 100644 --- a/lib/ep2/Passes/GlobalToPartitionPass.cpp +++ b/lib/ep2/Passes/GlobalToPartitionPass.cpp @@ -40,6 +40,7 @@ class GlobalImportPattern : public OpRewritePattern { assert(global != nullptr); rewriter.replaceOpWithNewOp(refOp, global.getType()); + return success(); } }; } // rewrite pattern @@ -55,6 +56,7 @@ void GlobalToPartitionPass::runOnOperation() { return signalPassFailure(); // remove global op if possible if necessary + llvm::SmallVector toErase; for (auto global : moduleOp.getOps()) { bool hasUse = false; moduleOp->walk([&](GlobalImportOp refOp) { @@ -63,7 +65,10 @@ void GlobalToPartitionPass::runOnOperation() { }); if (!hasUse) - global.erase(); + toErase.push_back(global); + } + for (auto global : toErase) { + global.erase(); } }