From e8ed75126c6ee58956169167fcc0911827259839 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Wed, 30 Jun 2021 10:19:56 -0700 Subject: [PATCH] Fixed performance bug where copy propagation applied at return statement was not commited Made -propwithinverse default to on at -O3 --- src/mapleall/maple_me/src/me_prop.cpp | 2 +- src/mapleall/maple_me/src/prop.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/mapleall/maple_me/src/me_prop.cpp b/src/mapleall/maple_me/src/me_prop.cpp index d7f2a53687..a0aef45a74 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 76cd811256..2d91d7b180 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; } -- Gitee