diff --git a/src/script_opt/ScriptOpt.cc b/src/script_opt/ScriptOpt.cc index 0ac62f4e68..39ab8adb6f 100644 --- a/src/script_opt/ScriptOpt.cc +++ b/src/script_opt/ScriptOpt.cc @@ -130,13 +130,19 @@ void optimize_func(ScriptFunc* f, std::shared_ptr pf, rc->SetDefSetsMgr(reduced_rds.GetDefSetsMgr()); - auto ud = std::make_unique(body, rc); + auto ud = std::make_shared(body, rc); ud->Analyze(); if ( analysis_options.dump_uds ) ud->Dump(); - ud->RemoveUnused(); + new_body = ud->RemoveUnused(); + + if ( new_body != body ) + { + f->ReplaceBody(body, new_body); + body = new_body; + } int new_frame_size = scope->Length() + rc->NumTemps() + rc->NumNewLocals(); diff --git a/src/script_opt/UseDefs.cc b/src/script_opt/UseDefs.cc index f8476e5d68..c26ad73f09 100644 --- a/src/script_opt/UseDefs.cc +++ b/src/script_opt/UseDefs.cc @@ -37,7 +37,7 @@ void UseDefs::Analyze() (void) PropagateUDs(body, nullptr, nullptr, false); } -void UseDefs::RemoveUnused() +StmtPtr UseDefs::RemoveUnused() { int iter = 0; while ( RemoveUnused(++iter) ) @@ -48,6 +48,8 @@ void UseDefs::RemoveUnused() if ( reporter->Errors() > 0 ) break; } + + return body; } void UseDefs::Dump() diff --git a/src/script_opt/UseDefs.h b/src/script_opt/UseDefs.h index a00b42e0cf..2d61fb4f20 100644 --- a/src/script_opt/UseDefs.h +++ b/src/script_opt/UseDefs.h @@ -57,14 +57,18 @@ public: // True if we've computed use-defs for the given statement. bool HasUsage(const Stmt* s) const { return use_defs_map.find(s) != use_defs_map.end(); } + bool HasUsage(const StmtPtr& s) const + { return HasUsage(s.get()); } // Returns the use-defs for the given statement. UDs GetUsage(const Stmt* s) const { return FindUsage(s); } + UDs GetUsage(const StmtPtr& s) const { return FindUsage(s.get()); } // Removes assignments corresponding to unused temporaries. // In the process, reports on locals that are assigned - // but never used. - void RemoveUnused(); + // but never used. Returns the body, which may have been + // changed if the original first statement has been pruned. + StmtPtr RemoveUnused(); void Dump();