diff --git a/src/mapleall/maple_me/src/me_prop.cpp b/src/mapleall/maple_me/src/me_prop.cpp index d7f2a53687efeedb9bc12bedf0a3559aba1e9154..a0aef45a74b7ef814fb2b2cfc32999d274a3c4ad 100644 --- a/src/mapleall/maple_me/src/me_prop.cpp +++ b/src/mapleall/maple_me/src/me_prop.cpp @@ -51,7 +51,7 @@ AnalysisResult *MeDoMeProp::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResu } MeProp meProp(*hMap, *dom, *NewMemPool(), Prop::PropConfig { MeOption::propBase, propIloadRef, MeOption::propGlobalRef, MeOption::propFinaliLoadRef, MeOption::propIloadRefNonParm, MeOption::propAtPhi, - MeOption::propWithInverse }); + MeOption::propWithInverse || MeOption::optLevel >= 3 }); meProp.TraversalBB(*func->GetCfg()->GetCommonEntryBB()); if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "\n============== After Copy Propagation =============" << '\n'; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index 76cd811256ecfe02e8460007638840c522032855..2d91d7b18004147b82c40c6167246e7bbbe91203 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -833,14 +833,16 @@ void Prop::TraversalMeStmt(MeStmt &meStmt) { break; } case OP_return: { - auto &retMeStmt = static_cast(meStmt); - const MapleVector &opnds = retMeStmt.GetOpnds(); - for (size_t i = 0; i < opnds.size(); ++i) { + RetMeStmt *retmestmt = &static_cast(meStmt); + const MapleVector &opnds = retmestmt->GetOpnds(); + // java return operand cannot be expression because cleanup intrinsic is + // inserted before the return statement + if (JAVALANG && opnds.size() == 1 && opnds[0]->GetMeOp() == kMeOpVar) { + break; + } + for (size_t i = 0; i < opnds.size(); i++) { MeExpr *opnd = opnds[i]; - auto &propedExpr = PropMeExpr(utils::ToRef(opnd), subProped, false); - if (propedExpr.GetMeOp() == kMeOpVar) { - retMeStmt.SetOpnd(i, &propedExpr); - } + retmestmt->SetOpnd(i, &PropMeExpr(*opnd, subProped, false)); } break; }