diff --git a/src/mapleall/maple_me/include/orig_symbol.h b/src/mapleall/maple_me/include/orig_symbol.h index f6658debd91508be87bc1b6e6caa045cf161de9d..47b7ee7e78732dd841b2db2825f3097aeb24686b 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 eac9625f64fa57e46fd27ed1239f0635ca8562e7..9e80e740d33cafb4be520d9707a5ce9fe92f640e 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 1ac3d90c50ff6d39d6f5667042bd926085e042de..9311778b9b380aa2cadef78508c98d709d9bb1bf 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 5ed80f3ec0b9de003c4927d0b6fa4ee87406bc17..c6b8e7e186ab9955a1a3c89ddcc64d3a0c12df73 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()) {