From 0259eff7f76a36c7b31ddf9a377ac5ebcf730887 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 10 Aug 2021 20:52:35 -0700 Subject: [PATCH] Promote constants larger than 12 bits that are operands of conditional branches in loops to preg --- src/mapleall/maple_me/include/me_option.h | 2 + src/mapleall/maple_me/include/me_ssa_lpre.h | 8 +++- src/mapleall/maple_me/src/me_option.cpp | 32 +++++++++++++ src/mapleall/maple_me/src/me_ssa_lpre.cpp | 51 +++++++++++++++++++-- 4 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/mapleall/maple_me/include/me_option.h b/src/mapleall/maple_me/include/me_option.h index 1058d582de..a533678e1f 100644 --- a/src/mapleall/maple_me/include/me_option.h +++ b/src/mapleall/maple_me/include/me_option.h @@ -149,6 +149,8 @@ class MeOption : public MapleDriverOptionBase { static bool propDuringBuild; static bool propWithInverse; static bool lpreSpeculate; + static bool lpre4Address; + static bool lpre4LargeInt; static bool spillAtCatch; static bool optDirectCall; static bool decoupleStatic; diff --git a/src/mapleall/maple_me/include/me_ssa_lpre.h b/src/mapleall/maple_me/include/me_ssa_lpre.h index af183d4f58..da40bdd9da 100644 --- a/src/mapleall/maple_me/include/me_ssa_lpre.h +++ b/src/mapleall/maple_me/include/me_ssa_lpre.h @@ -57,14 +57,18 @@ class MeSSALPre : public SSAPre { } void CollectVarForMeExpr(MeExpr &meExpr, std::vector &varVec) const override { - if (meExpr.GetMeOp() == kMeOpAddrof || meExpr.GetMeOp() == kMeOpAddroffunc) { + if (meExpr.GetMeOp() == kMeOpAddrof || + meExpr.GetMeOp() == kMeOpAddroffunc || + meExpr.GetMeOp() == kMeOpConst) { return; } varVec.push_back(&meExpr); } void CollectVarForCand(MeRealOcc &realOcc, std::vector &varVec) const override { - if (realOcc.GetMeExpr()->GetMeOp() == kMeOpAddrof || realOcc.GetMeExpr()->GetMeOp() == kMeOpAddroffunc) { + if (realOcc.GetMeExpr()->GetMeOp() == kMeOpAddrof || + realOcc.GetMeExpr()->GetMeOp() == kMeOpAddroffunc || + realOcc.GetMeExpr()->GetMeOp() == kMeOpConst) { return; } varVec.push_back(realOcc.GetMeExpr()); diff --git a/src/mapleall/maple_me/src/me_option.cpp b/src/mapleall/maple_me/src/me_option.cpp index bfd211b7cc..aa00396b76 100644 --- a/src/mapleall/maple_me/src/me_option.cpp +++ b/src/mapleall/maple_me/src/me_option.cpp @@ -69,6 +69,8 @@ bool MeOption::epreIncludeRef = false; bool MeOption::epreLocalRefVar = true; bool MeOption::epreLHSIvar = true; bool MeOption::lpreSpeculate = false; +bool MeOption::lpre4Address = true; +bool MeOption::lpre4LargeInt = true; bool MeOption::spillAtCatch = false; bool MeOption::rcLowering = true; bool MeOption::optDirectCall = false; @@ -211,6 +213,10 @@ enum OptionIndex { kEnableEa, kLpreSpeculate, kNoLpreSpeculate, + kLpre4Address, + kNoLpre4Address, + kLpre4LargeInt, + kNoLpre4LargeInt, kSpillatCatch, kPlacementRC, kNoPlacementRC, @@ -979,6 +985,26 @@ const Descriptor kUsage[] = { " --no-lprespeculate \tDisable speculative code motion in LPRE phase\n", "me", {} }, + { kLpre4Address, + kEnable, + "", + "lpre4address", + kBuildTypeExperimental, + kArgCheckPolicyBool, + " --lpre4address \tEnable register promotion of addresses in LPRE phase\n" + " --no-lpre4address \tDisable register promotion of addresses in LPRE phase\n", + "me", + {} }, + { kLpre4LargeInt, + kEnable, + "", + "lpre4largeint", + kBuildTypeExperimental, + kArgCheckPolicyBool, + " --lpre4largeint \tEnable register promotion of large integers in LPRE phase\n" + " --no-lpre4largeint \tDisable register promotion of large integers in LPRE phase\n", + "me", + {} }, { kSpillatCatch, kEnable, "", @@ -1461,6 +1487,12 @@ bool MeOption::SolveOptions(const std::vector &opts, bool i case kLpreSpeculate: lpreSpeculate = (opt.Type() == kEnable); break; + case kLpre4Address: + lpre4Address = (opt.Type() == kEnable); + break; + case kLpre4LargeInt: + lpre4LargeInt = (opt.Type() == kEnable); + break; case kSpillatCatch: spillAtCatch = (opt.Type() == kEnable); break; diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 3ac9b057c2..ecb12bb3ea 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -305,8 +305,8 @@ void MeSSALPre::CreateMembarOccAtCatch(BB &bb) { // only handle the leaf of load, because all other expressions has been done by // previous SSAPre -void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, bool, MeExpr*, - bool, bool) { +void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, bool isRebuild, MeExpr *tmpVar, + bool isRootExpr, bool insertSorted) { MeExprOp meOp = meExpr.GetMeOp(); switch (meOp) { case kMeOpVar: { @@ -336,6 +336,9 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, if (preKind != kAddrPre) { break; } + if (!MeOption::lpre4Address) { + break; + } if (mirModule->IsJavaModule()) { auto *addrOfMeExpr = static_cast(&meExpr); const OriginalSt *ost = ssaTab->GetOriginalStFromID(addrOfMeExpr->GetOstIdx()); @@ -350,6 +353,42 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, if (preKind != kAddrPre) { break; } + if (!MeOption::lpre4Address) { + break; + } + (void)CreateRealOcc(meStmt, seqStmt, meExpr, false); + break; + } + case kMeOpConst: { + if (!MeOption::lpre4LargeInt) { + break; + } + if (!IsPrimitiveInteger(meExpr.GetPrimType())) { + break; + } + MIRIntConst *intConst = dynamic_cast(static_cast(meExpr).GetConstVal()); + if (intConst == nullptr) { + break; + } + if ((intConst->GetValue() >> 12) == 0) { + break; // not promoting if value fits in 12 bits + } + if (!meStmt.GetBB()->GetAttributes(kBBAttrIsInLoop)) { + break; + } + if (meStmt.GetOp() != OP_brfalse && meStmt.GetOp() != OP_brtrue) { + break; + } + OpMeExpr *compareX = dynamic_cast(meStmt.GetOpnd(0)); + if (compareX == nullptr) { + break; + } + if (!kOpcodeInfo.IsCompare(compareX->GetOp())) { + break; + } + if (compareX->GetOpnd(1) != &meExpr) { + break; + } (void)CreateRealOcc(meStmt, seqStmt, meExpr, false); break; } @@ -448,9 +487,11 @@ bool MESSALPre::PhaseRun(maple::MeFunction &f) { ssaUpdate.Run(); } } - MeLowerGlobals lowerGlobals(f, f.GetMeSSATab()); - lowerGlobals.Run(); - { + if (MeOption::lpre4Address) { + MeLowerGlobals lowerGlobals(f, f.GetMeSSATab()); + lowerGlobals.Run(); + } + if (MeOption::lpre4Address || MeOption::lpre4LargeInt) { MeSSALPre ssaLpre(f, *irMap, *dom, *ApplyTempMemPool(), *ApplyTempMemPool(), kAddrPre, lpreLimitUsed); ssaLpre.SetSpillAtCatch(MeOption::spillAtCatch); if (DEBUGFUNC_NEWPM(f)) { -- Gitee