diff --git a/src/mapleall/maple_me/include/ssa_epre.h b/src/mapleall/maple_me/include/ssa_epre.h index a360c9ca6bb4eb25e162ae7f410e707c80eae822..5db9da0a2a7f79c1b5872f0892cff40bfbcbf50c 100644 --- a/src/mapleall/maple_me/include/ssa_epre.h +++ b/src/mapleall/maple_me/include/ssa_epre.h @@ -52,15 +52,12 @@ class SSAEPre : public SSAPre { } // here starts methods related to strength reduction bool AllVarsSameVersion(const MeRealOcc &realocc1, const MeRealOcc &realocc2) const override; - VarMeExpr *ResolveAllInjuringDefs(VarMeExpr *varx) const override; - RegMeExpr *ResolveAllInjuringDefs(RegMeExpr *regx) const override; + ScalarMeExpr *ResolveAllInjuringDefs(ScalarMeExpr *regx) const override; MeExpr *ResolveAllInjuringDefs(MeExpr *x) const override { if (!workCand->isSRCand) { return x; } - return (x->GetMeOp() == kMeOpVar) ? - static_cast(ResolveAllInjuringDefs(static_cast(x))) : - static_cast(ResolveAllInjuringDefs(static_cast(x))); + return static_cast(ResolveAllInjuringDefs(static_cast(x))); } void SubstituteOpnd(MeExpr *x, MeExpr *oldopnd, MeExpr *newopnd) override; bool OpndInDefOcc(MeExpr *opnd, MeOccur *defocc, uint32 i); diff --git a/src/mapleall/maple_me/include/ssa_tab.h b/src/mapleall/maple_me/include/ssa_tab.h index 028e9f63b09395d751ea941b538ce0d0ca434d0a..de3fa2cd811f23f50bcb41c18ea0a958813a1966 100644 --- a/src/mapleall/maple_me/include/ssa_tab.h +++ b/src/mapleall/maple_me/include/ssa_tab.h @@ -21,12 +21,16 @@ #include "ssa_mir_nodes.h" namespace maple { + +class MeFunction; + class SSATab : public AnalysisResult { // represent the SSA table public: - SSATab(MemPool *memPool, MemPool *versMp, MIRModule *mod) + SSATab(MemPool *memPool, MemPool *versMp, MIRModule *mod, MeFunction *f) : AnalysisResult(memPool), mirModule(*mod), + func(f), versAlloc(versMp), versionStTable(*versMp), originalStTable(*memPool, *mod), @@ -175,6 +179,7 @@ class SSATab : public AnalysisResult { } private: MIRModule &mirModule; + MeFunction *func; MapleAllocator versAlloc; VersionStTable versionStTable; // this uses special versMp because it will be freed earlier OriginalStTable originalStTable; diff --git a/src/mapleall/maple_me/src/me_ssa_epre.cpp b/src/mapleall/maple_me/src/me_ssa_epre.cpp index a7badd23c159a3c860c377b5531f62a00d55914b..0335d5a007743e156fb7dd1b9c1205d829c1c171 100644 --- a/src/mapleall/maple_me/src/me_ssa_epre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_epre.cpp @@ -90,7 +90,7 @@ AnalysisResult *MeDoSSAEPre::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRes MeSSAEPre ssaPre(*func, *irMap, *dom, kh, *ssaPreMemPool, *NewMemPool(), epreLimitUsed, epreIncludeRef, MeOption::epreLocalRefVar, MeOption::epreLHSIvar); ssaPre.SetSpillAtCatch(MeOption::spillAtCatch); - if (MeOption::strengthReduction) { + if (MeOption::strengthReduction && !func->GetMIRModule().IsJavaModule()) { ssaPre.strengthReduction = true; } if (func->GetHints() & kPlacementRCed) { @@ -114,7 +114,7 @@ AnalysisResult *MeDoSSAEPre::Run(MeFunction *func, MeFuncResultMgr *m, ModuleRes placeRC.preKind = MeSSUPre::kSecondDecrefPre; placeRC.ApplySSUPre(); } - if (MeOption::strengthReduction) { // for deleting redundant injury repairs + if (ssaPre.strengthReduction) { // for deleting redundant injury repairs MeHDSE hdse(*func, *dom, *func->GetIRMap(), DEBUGFUNC(func)); if (!MeOption::quiet) { LogInfo::MapleLogger() << " == " << PhaseName() << " invokes [ " << hdse.PhaseName() << " ] ==\n"; diff --git a/src/mapleall/maple_me/src/me_ssa_tab.cpp b/src/mapleall/maple_me/src/me_ssa_tab.cpp index b059b7f2e7b45ce0fd9ce85bab30117f15e19780..5136f2a96802e4237eb125b35714011e1320b8f2 100644 --- a/src/mapleall/maple_me/src/me_ssa_tab.cpp +++ b/src/mapleall/maple_me/src/me_ssa_tab.cpp @@ -28,7 +28,7 @@ AnalysisResult *MeDoSSATab::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResu } MemPool *memPool = NewMemPool(); // allocate ssaTab including its SSAPart to store SSA information for statements - auto *ssaTab = memPool->New(memPool, func->GetVersMp(), &func->GetMIRModule()); + auto *ssaTab = memPool->New(memPool, func->GetVersMp(), &func->GetMIRModule(), func); func->SetMeSSATab(ssaTab); #if DEBUG globalSSATab = ssaTab; diff --git a/src/mapleall/maple_me/src/ssa_epre.cpp b/src/mapleall/maple_me/src/ssa_epre.cpp index bca8dde259855d535fb70d3e22d94a85e2815b19..401745161a6da82bb5aeb0d4e756fedd0853150d 100644 --- a/src/mapleall/maple_me/src/ssa_epre.cpp +++ b/src/mapleall/maple_me/src/ssa_epre.cpp @@ -225,7 +225,8 @@ MeExpr *SSAEPre::PhiOpndFromRes(MeRealOcc &realZ, size_t j) const { case kMeOpOp: { OpMeExpr opMeExpr(*static_cast(realZ.GetMeExpr()), -1); for (size_t i = 0; i < opMeExpr.GetNumOpnds(); ++i) { - MeExpr *retOpnd = GetReplaceMeExpr(*opMeExpr.GetOpnd(i), *ePhiBB, j); + MeExpr *resolvedOpnd = ResolveAllInjuringDefs(opMeExpr.GetOpnd(i)); + MeExpr *retOpnd = GetReplaceMeExpr(*resolvedOpnd, *ePhiBB, j); if (retOpnd != nullptr) { opMeExpr.SetOpnd(i, retOpnd); } diff --git a/src/mapleall/maple_me/src/ssa_epre_for_sr.cpp b/src/mapleall/maple_me/src/ssa_epre_for_sr.cpp index 9882180098b4e6548c18f824b16d1cec47a0e337..e7d0665bbe0bea252ab7c48c3f2aeca448c6cc84 100644 --- a/src/mapleall/maple_me/src/ssa_epre_for_sr.cpp +++ b/src/mapleall/maple_me/src/ssa_epre_for_sr.cpp @@ -17,47 +17,11 @@ namespace maple { -static VarMeExpr* ResolveOneInjuringDef(VarMeExpr *varx) { - if (varx->GetDefBy() != kDefByStmt) { - return varx; - } - DassignMeStmt *dass = static_cast(varx->GetDefStmt()); - CHECK_FATAL(dass->GetOp() == OP_dassign, "ResolveInjuringDefs: defStmt is not a dassign"); - CHECK_FATAL(dass->GetLHS() == varx, "ResolveInjuringDefs: defStmt has different lhs"); - if (!dass->isIncDecStmt) { - return varx; - } - CHECK_FATAL(dass->GetRHS()->GetMeOp() == kMeOpOp, - "ResolveOneInjuringDef: dassign marked isIncDecStmt has unexpected rhs form."); - OpMeExpr *oprhs = static_cast(dass->GetRHS()); - CHECK_FATAL(oprhs->GetOpnd(0)->GetMeOp() == kMeOpVar, - "ResolveOneInjuringDef: dassign marked isIncDecStmt has unexpected form."); - VarMeExpr *rhsvar = static_cast(oprhs->GetOpnd(0)); - CHECK_FATAL(rhsvar->GetOst() == varx->GetOst(), - "ResolveOneInjuringDef: dassign marked isIncDecStmt has unexpected rhs var."); - return rhsvar; -} - -VarMeExpr* SSAEPre::ResolveAllInjuringDefs(VarMeExpr *varx) const { - if (!workCand->isSRCand) { - return varx; - } - while (true) { - VarMeExpr *answer = ResolveOneInjuringDef(varx); - if (answer == varx) { - return answer; - } else { - varx = answer; - } - } -} - -static RegMeExpr* ResolveOneInjuringDef(RegMeExpr *regx) { +static ScalarMeExpr* ResolveOneInjuringDef(ScalarMeExpr *regx) { if (regx->GetDefBy() != kDefByStmt) { return regx; } AssignMeStmt *rass = static_cast(regx->GetDefStmt()); - CHECK_FATAL(rass->GetOp() == OP_regassign, "ResolveInjuringDefs: defStmt is not a regassign"); CHECK_FATAL(rass->GetLHS() == regx, "ResolveInjuringDefs: defStmt has different lhs"); if (!rass->isIncDecStmt) { return regx; @@ -65,7 +29,7 @@ static RegMeExpr* ResolveOneInjuringDef(RegMeExpr *regx) { CHECK_FATAL(rass->GetRHS()->GetMeOp() == kMeOpOp, "ResolveOneInjuringDef: regassign marked isIncDecStmt has unexpected rhs form."); OpMeExpr *oprhs = static_cast(rass->GetRHS()); - CHECK_FATAL(oprhs->GetOpnd(0)->GetMeOp() == kMeOpReg, + CHECK_FATAL(oprhs->GetOpnd(0)->GetMeOp() == kMeOpVar || oprhs->GetOpnd(0)->GetMeOp() == kMeOpReg, "ResolveOneInjuringDef: regassign marked isIncDecStmt has unexpected form."); RegMeExpr *rhsreg = static_cast(oprhs->GetOpnd(0)); CHECK_FATAL(rhsreg->GetOst() == regx->GetOst(), @@ -73,7 +37,7 @@ static RegMeExpr* ResolveOneInjuringDef(RegMeExpr *regx) { return rhsreg; } -RegMeExpr* SSAEPre::ResolveAllInjuringDefs(RegMeExpr *regx) const { +ScalarMeExpr* SSAEPre::ResolveAllInjuringDefs(ScalarMeExpr *regx) const { if (!workCand->isSRCand) { return regx; } @@ -131,14 +95,8 @@ void SSAEPre::SRSetNeedRepair(MeOccur *useocc, std::set *needRepairInj continue; } if (!OpndInDefOcc(curopnd, defocc, i)) { - if (curopnd->GetMeOp() == kMeOpVar) { - VarMeExpr *varx = static_cast(curopnd); - needRepairInjuringDefs->insert(varx->GetDefStmt()); - } else { - RegMeExpr *regx = static_cast(curopnd); - needRepairInjuringDefs->insert(regx->GetDefStmt()); - } - return; // restricted injury requirement to at most 1 operand + ScalarMeExpr *varx = static_cast(curopnd); + needRepairInjuringDefs->insert(varx->GetDefStmt()); } } } @@ -225,7 +183,7 @@ MeExpr* SSAEPre::SRRepairOpndInjuries(MeExpr *curopnd, MeOccur *defocc, int32 i, if (curopnd->GetMeOp() == kMeOpVar) { VarMeExpr *varx = static_cast(curopnd); DassignMeStmt *dass = static_cast(varx->GetDefStmt()); - CHECK_FATAL(dass->isIncDecStmt, "SRRepairInjuries: not an inc/dec statement"); + CHECK_FATAL(dass->isIncDecStmt, "SRRepairOpndInjuries: not an inc/dec statement"); MeStmt *latestInjuringDef = dass; if (repairedInjuringDefs->count(dass) == 0) { repairedInjuringDefs->insert(dass); @@ -239,7 +197,7 @@ MeExpr* SSAEPre::SRRepairOpndInjuries(MeExpr *curopnd, MeOccur *defocc, int32 i, } else { varx = rhsvar; dass = static_cast(varx->GetDefStmt()); - CHECK_FATAL(dass->isIncDecStmt, "SRRepairInjuries: not an inc/dec statement"); + CHECK_FATAL(dass->isIncDecStmt, "SRRepairOpndInjuries: not an inc/dec statement"); done = needRepairInjuringDefs->count(dass) == 1; if (done) { if (repairedInjuringDefs->count(dass) == 0) { @@ -260,7 +218,7 @@ MeExpr* SSAEPre::SRRepairOpndInjuries(MeExpr *curopnd, MeOccur *defocc, int32 i, } else { // kMeOpReg RegMeExpr *regx = static_cast(curopnd); AssignMeStmt *rass = static_cast(regx->GetDefStmt()); - CHECK_FATAL(rass->isIncDecStmt, "SRRepairInjuries: not an inc/dec statement"); + CHECK_FATAL(rass->isIncDecStmt, "SRRepairOpndInjuries: not an inc/dec statement"); MeStmt *latestInjuringDef = rass; if (repairedInjuringDefs->count(rass) == 0) { repairedInjuringDefs->insert(rass); @@ -274,7 +232,7 @@ MeExpr* SSAEPre::SRRepairOpndInjuries(MeExpr *curopnd, MeOccur *defocc, int32 i, } else { regx = rhsreg; rass = static_cast(regx->GetDefStmt()); - CHECK_FATAL(rass->isIncDecStmt, "SRRepairInjuries: not an inc/dec statement"); + CHECK_FATAL(rass->isIncDecStmt, "SRRepairOpndInjuries: not an inc/dec statement"); done = needRepairInjuringDefs->count(rass) == 1; if (done) { if (repairedInjuringDefs->count(rass) == 0) { @@ -332,8 +290,6 @@ MeExpr* SSAEPre::SRRepairInjuries(MeOccur *useocc, if (!OpndInDefOcc(curopnd, defocc, i)) { repairedTemp = SRRepairOpndInjuries(curopnd, defocc, i, repairedTemp, needRepairInjuringDefs, repairedInjuringDefs); - // restricted to only 1 var or reg injured - break; } } // for return repairedTemp; diff --git a/src/mapleall/maple_me/src/ssa_pre.cpp b/src/mapleall/maple_me/src/ssa_pre.cpp index e1740af7a477f54dbd3f0aa1c5e9310161211808..12b46830f57ef3f3ad73f3fb314bef84896c9b92 100644 --- a/src/mapleall/maple_me/src/ssa_pre.cpp +++ b/src/mapleall/maple_me/src/ssa_pre.cpp @@ -198,7 +198,7 @@ void SSAPre::UpdateInsertedPhiOccOpnd() { } void SSAPre::CodeMotion() { - std::set needRepairInjuringDefs; // for marking injuring defs that have been repaired + std::set needRepairInjuringDefs; // for marking injuring defs that need repair if (workCand->isSRCand) { // pre-pass needed by strength reduction for (MeOccur *occ : allOccs) { @@ -956,9 +956,6 @@ void SSAPre::Rename2() { OpMeExpr opmeexpr(*static_cast(exprY), -1); for (uint32 ii = 0; ii < varVecY.size(); ii++) { MeExpr *resolvedY = ResolveAllInjuringDefs(varVecY[ii]); - if (resolvedY != varVecY[ii]) { - SubstituteOpnd(&opmeexpr, varVecY[ii], resolvedY); - } if (!DefVarDominateOcc(resolvedY, *defX)) { alldom = false; } @@ -1014,11 +1011,7 @@ void SSAPre::SetVarPhis(MeExpr *meExpr) { ScalarMeExpr *scalar = static_cast(meExpr); if (workCand->isSRCand) { - if (scalar->GetMeOp() == kMeOpVar) { - scalar = ResolveAllInjuringDefs(static_cast(scalar)); - } else { - scalar = ResolveAllInjuringDefs(scalar); - } + scalar = ResolveAllInjuringDefs(scalar); } if (scalar->IsDefByPhi()) { MePhiNode *phiMeNode = scalar->GetMePhiDef(); diff --git a/src/mapleall/maple_me/src/ssa_tab.cpp b/src/mapleall/maple_me/src/ssa_tab.cpp index 261099d9d62996367ce4acc6bb3ea6fe66edebb1..2bac8e55ff9986cedad1fbdfb2c477e4cd0a2e7c 100644 --- a/src/mapleall/maple_me/src/ssa_tab.cpp +++ b/src/mapleall/maple_me/src/ssa_tab.cpp @@ -20,6 +20,7 @@ #include "mir_function.h" #include "mir_lower.h" #include "me_option.h" +#include "me_function.h" // Allocate data structures to store SSA information. Only statement nodes and // tree nodes that incur defs and uses are relevant. Tree nodes are made larger @@ -29,8 +30,7 @@ namespace maple { BaseNode *SSATab::CreateSSAExpr(BaseNode *expr) { bool arrayLowered = false; - if (expr->GetOpCode() == OP_array && !mirModule.IsJavaModule() && - MeOption::strengthReduction /* && in-main-me-phase */) { + if (expr->GetOpCode() == OP_array && !mirModule.IsJavaModule() && !func->IsLfo() && MeOption::strengthReduction) { MIRLower mirLower(mirModule, mirModule.CurFunction()); expr = mirLower.LowerCArray(static_cast(expr)); arrayLowered = true;