From d8aa3edf70f3ae2c745b0f10cf81f85a748f45bd Mon Sep 17 00:00:00 2001 From: Frederick Chow Date: Sun, 31 Jan 2021 23:14:56 -0800 Subject: [PATCH] Remove unnecessary first pass in rename2preg by making use of OriginalSt's addressTaken field --- src/mapleall/maple_me/include/orig_symbol.h | 4 ++ src/mapleall/maple_me/src/alias_class.cpp | 1 + src/mapleall/maple_me/src/me_rename2preg.cpp | 57 ++------------------ src/mapleall/maple_me/src/me_ssa_lpre.cpp | 5 +- 4 files changed, 13 insertions(+), 54 deletions(-) diff --git a/src/mapleall/maple_me/include/orig_symbol.h b/src/mapleall/maple_me/include/orig_symbol.h index f6658debd9..47b7ee7e78 100644 --- a/src/mapleall/maple_me/include/orig_symbol.h +++ b/src/mapleall/maple_me/include/orig_symbol.h @@ -177,6 +177,10 @@ class OriginalSt { return addressTaken; } + void SetAddressTaken(bool addrTaken = true) { + addressTaken = addrTaken; + } + bool IsEPreLocalRefVar() const { return epreLocalRefVar; } diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index eac9625f64..9e80e740d3 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -115,6 +115,7 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { switch (expr.GetOpCode()) { case OP_addrof: { OriginalSt &oSt = *static_cast(expr).GetSSAVar()->GetOrigSt(); + oSt.SetAddressTaken(); FindOrCreateAliasElem(oSt); return &FindOrCreateAliasElemOfAddrofOSt(oSt); } diff --git a/src/mapleall/maple_me/src/me_rename2preg.cpp b/src/mapleall/maple_me/src/me_rename2preg.cpp index 1ac3d90c50..9311778b9b 100755 --- a/src/mapleall/maple_me/src/me_rename2preg.cpp +++ b/src/mapleall/maple_me/src/me_rename2preg.cpp @@ -13,7 +13,6 @@ * See the Mulan PSL v2 for more details. */ #include "me_rename2preg.h" -#include #include #include "mir_builder.h" #include "me_irmap.h" @@ -190,43 +189,6 @@ class SSARename2Preg { return name; } - void CollectRefedOst(MeExpr &meExpr) { - MeExprOp op = meExpr.GetMeOp(); - switch (op) { - case kMeOpOp: { - OpMeExpr &expr = static_cast(meExpr); - for (uint32 i = 0; i < kOperandNumTernary; ++i) { - MeExpr *opnd = expr.GetOpnd(i); - if (opnd != nullptr) { - CollectRefedOst(*opnd); - } - } - break; - } - case kMeOpNary: { - NaryMeExpr &expr = static_cast(meExpr); - MapleVector &opnds = expr.GetOpnds(); - for (MapleVector::iterator it = opnds.begin(); it != opnds.end(); ++it) { - CollectRefedOst(*(*it)); - } - break; - } - case kMeOpIvar: { - IvarMeExpr &expr = static_cast(meExpr); - CollectRefedOst(*(expr.GetBase())); - break; - } - case kMeOpAddrof: { - AddrofMeExpr &expr = static_cast(meExpr); - referencedOst[expr.GetOstIdx().GetIdx()] = true; - break; - } - default: - break; - } - return; - } - void Run(MeFunction &func, MeFuncResultMgr *pFuncRst) { bool emptyFunc = func.empty(); if (!emptyFunc) { @@ -235,15 +197,6 @@ class SSARename2Preg { const AliasClass &aliasClass = utils::ToRef(GetAnalysisResult(func, funcRst)); cacheProxy.Init(utils::ToRef(ssaTab), irMap); - // first pass: collect var that is referenced - for (auto it = func.valid_begin(), eIt = func.valid_end(); it != eIt; ++it) { - BB &bb = utils::ToRef(*it); - for (MeStmt &stmt : bb.GetMeStmts()) { - for (size_t i = 0; i < stmt.NumMeStmtOpnds(); ++i) { - CollectRefedOst(*stmt.GetOpnd(i)); - } - } - } for (auto it = func.valid_begin(), eIt = func.valid_end(); it != eIt; ++it) { BB &bb = utils::ToRef(*it); @@ -419,10 +372,6 @@ class SSARename2Preg { return nullptr; } - if (referencedOst[ost.GetIndex().GetIdx()]) { - return nullptr; - } - CHECK_FATAL(ost.IsRealSymbol(), "NYI"); const MIRSymbol &irSymbol = utils::ToRef(ost.GetMIRSymbol()); if (irSymbol.GetAttr(ATTR_localrefvar)) { @@ -443,6 +392,9 @@ class SSARename2Preg { if (!irSymbol.IsLocal()) { return nullptr; } + if (ost.IsAddressTaken()) { + return nullptr; + } const AliasElem *aliasElem = GetAliasElem(aliasClass, ost); if (aliasElem == nullptr || aliasElem->GetClassSet() != nullptr) { return nullptr; @@ -475,9 +427,8 @@ class SSARename2Preg { CacheProxy cacheProxy; FormalRenaming formal; - std::unordered_map referencedOst; }; -} +} // namespace namespace maple { diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 5ed80f3ec0..c6b8e7e186 100755 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -170,7 +170,10 @@ void MeSSALPre::BuildEntryLHSOcc4Formals() const { PreWorkCand *workCand = GetWorkCand(); auto *varMeExpr = static_cast(workCand->GetTheMeExpr()); const OriginalSt *ost = ssaTab->GetSymbolOriginalStFromID(varMeExpr->GetOStIdx()); - if (!ost->IsFormal()) { + if (!ost->IsFormal() || ost->IsAddressTaken()) { + return; + } + if (ost->GetFieldID() != 0) { return; } if (assignedFormals.find(ost->GetIndex()) != assignedFormals.end()) { -- Gitee