From b3128832c3ec16292c79bd9a185b21b2ebed8a2c Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 3 Jun 2021 00:34:17 -0700 Subject: [PATCH] Fixed strength reduction bugs --- src/mapleall/maple_me/include/ssa_epre.h | 7 +-- src/mapleall/maple_me/include/ssa_tab.h | 7 ++- src/mapleall/maple_me/src/me_ssa_epre.cpp | 4 +- src/mapleall/maple_me/src/me_ssa_tab.cpp | 2 +- src/mapleall/maple_me/src/ssa_epre.cpp | 3 +- src/mapleall/maple_me/src/ssa_epre_for_sr.cpp | 62 +++---------------- src/mapleall/maple_me/src/ssa_pre.cpp | 11 +--- src/mapleall/maple_me/src/ssa_tab.cpp | 4 +- 8 files changed, 26 insertions(+), 74 deletions(-) diff --git a/src/mapleall/maple_me/include/ssa_epre.h b/src/mapleall/maple_me/include/ssa_epre.h index a360c9ca6b..5db9da0a2a 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 028e9f63b0..de3fa2cd81 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 a7badd23c1..0335d5a007 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 b059b7f2e7..5136f2a968 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 bca8dde259..401745161a 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 9882180098..e7d0665bbe 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 e1740af7a4..12b46830f5 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 261099d9d6..2bac8e55ff 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; -- Gitee