diff --git a/src/mapleall/maple_me/include/irmap.h b/src/mapleall/maple_me/include/irmap.h index 7932e47e8a42b2115e8245e0ee3118e478bd23c9..60f8c3e30205f6abe48f514794d6bb65a420bf89 100755 --- a/src/mapleall/maple_me/include/irmap.h +++ b/src/mapleall/maple_me/include/irmap.h @@ -34,7 +34,6 @@ class IRMap : public AnalysisResult { mapHashLength(hashTableSize), hashTable(mapHashLength, nullptr, irMapAlloc.Adapter()), vst2MeExprTable(ssaTab.GetVersionStTableSize(), nullptr, irMapAlloc.Adapter()), - regMeExprTable(irMapAlloc.Adapter()), lpreTmps(irMapAlloc.Adapter()), vst2Decrefs(irMapAlloc.Adapter()), meBuilder(irMapAlloc) {} @@ -161,10 +160,6 @@ class IRMap : public AnalysisResult { vst2MeExprTable.push_back(item); } - const MapleVector &GetRegMeExprTable() const { - return regMeExprTable; - } - MapleUnorderedMap::iterator GetLpreTmpsEnd() { return lpreTmps.end(); } @@ -217,7 +212,6 @@ class IRMap : public AnalysisResult { uint32 mapHashLength; // size of hashTable MapleVector hashTable; // the value number hash table MapleVector vst2MeExprTable; // map versionst to MeExpr. - MapleVector regMeExprTable; // record all the regmeexpr created by ssa_pre MapleUnorderedMap lpreTmps; // for passing LPRE's temp usage to SPRE MapleUnorderedMap*> vst2Decrefs; // map versionst to decrefreset. bool needAnotherPass = false; // set to true if CFG has changed diff --git a/src/mapleall/maple_me/include/me_ir.h b/src/mapleall/maple_me/include/me_ir.h index 6f6ec5c9a51c57528064f227b1beeefa3a221755..be7e567c8a4e86b9ec549c9f17c84c60e0458bab 100755 --- a/src/mapleall/maple_me/include/me_ir.h +++ b/src/mapleall/maple_me/include/me_ir.h @@ -477,8 +477,7 @@ class RegMeExpr : public ScalarMeExpr { RegMeExpr(MapleAllocator *alloc, int32 exprid, PregIdx preg, PUIdx pidx, OStIdx oidx, uint32 vidx) : ScalarMeExpr(exprid, oidx, vidx, kMeOpReg), regIdx(preg), - puIdx(pidx), - phiUseSet(std::less(), alloc->Adapter()) {} + puIdx(pidx) {} ~RegMeExpr() = default; @@ -499,19 +498,13 @@ class RegMeExpr : public ScalarMeExpr { return puIdx; } - MapleSet &GetPhiUseSet() { - return phiUseSet; - } - bool IsNormalReg() const { return regIdx >= 0; } private: PregIdx16 regIdx; - bool recursivePtr = false; // if pointer to recursive data structures; PUIdx puIdx; - MapleSet phiUseSet; // the use set of this reg node, used by preg renamer }; class ConstMeExpr : public MeExpr { diff --git a/src/mapleall/maple_me/include/preg_renamer.h b/src/mapleall/maple_me/include/preg_renamer.h index 333974a5f5987639abecfc8c013ff9780b8b497b..efb979494bed78047a78c92bda353f5c759d497d 100644 --- a/src/mapleall/maple_me/include/preg_renamer.h +++ b/src/mapleall/maple_me/include/preg_renamer.h @@ -1,36 +1,24 @@ -/* - * Copyright (c) [2020] Huawei Technologies Co.,Ltd.All rights reserved. - * - * OpenArkCompiler is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR - * FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -#ifndef MAPLE_ME_INCLUDE_PREGRENAMER_H -#define MAPLE_ME_INCLUDE_PREGRENAMER_H +#ifndef MAPLEME_INCLUDE_ME_PREGRENAMER_H +#define MAPLEME_INCLUDE_ME_PREGRENAMER_H #include "me_irmap.h" #include "ssa_pre.h" namespace maple { + class PregRenamer { public: - PregRenamer(MemPool &memPool, MeFunction &f, MeIRMap &irMap, bool enabledDebug) - : alloc(&memPool), func(&f), irMap(&irMap), enabledDebug(enabledDebug) {} - virtual ~PregRenamer() = default; + PregRenamer(MemPool *mp, MeFunction *f, MeIRMap *hmap) : mp(mp), alloc(mp), func(f), meirmap(hmap) {} void RunSelf() const; private: - void EnqueDefUses(std::list &qu, RegMeExpr *node, std::set &curVisited) const; + std::string PhaseName() const { + return "pregrename"; + } + private: + MemPool *mp; MapleAllocator alloc; MeFunction *func; - MeIRMap *irMap; - bool enabledDebug; + MeIRMap *meirmap; }; class MeDoPregRename : public MeFuncPhase { @@ -44,4 +32,4 @@ class MeDoPregRename : public MeFuncPhase { } }; } // namespace maple -#endif // MAPLE_ME_INCLUDE_PREGRENAMER_H +#endif // MAPLEME_INCLUDE_ME_PREGRENAMER_H diff --git a/src/mapleall/maple_me/src/irmap.cpp b/src/mapleall/maple_me/src/irmap.cpp index e729d42a52c4fb0423eff4171dab680afcbe4547..929e535a540dfaec2c973b2579b2a33c58018b2f 100755 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -126,7 +126,6 @@ RegMeExpr *IRMap::CreateRegMeExprVersion(const OriginalSt &pregOSt) { auto *regReadExpr = NewInPool(exprID++, pregOSt.GetPregIdx(), pregOSt.GetPuIdx(), pregOSt.GetIndex(), 0); regReadExpr->InitBase(OP_regread, pregOSt.GetMIRPreg()->GetPrimType(), 0); - regMeExprTable.push_back(regReadExpr); return regReadExpr; } @@ -134,7 +133,6 @@ RegMeExpr *IRMap::CreateRegMeExprVersion(const RegMeExpr &origExpr) { auto *regReadExpr = NewInPool(exprID++, origExpr.GetRegIdx(), origExpr.GetPuIdx(), origExpr.GetOstIdx(), 0); regReadExpr->InitBase(origExpr.GetOp(), origExpr.GetPrimType(), origExpr.GetNumOpnds()); - regMeExprTable.push_back(regReadExpr); return regReadExpr; } @@ -152,7 +150,6 @@ RegMeExpr *IRMap::CreateRefRegMeExpr(const MIRSymbol &mirSt) { OriginalSt *oSt = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); auto *regreadexpr = NewInPool(exprID++, regIdx, mirFunc->GetPuidx(), oSt->GetIndex(), 0); regreadexpr->InitBase(OP_regread, pType, 0); - regMeExprTable.push_back(regreadexpr); return regreadexpr; } @@ -163,7 +160,6 @@ RegMeExpr *IRMap::CreateRegMeExpr(PrimType pType) { OriginalSt *ost = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); auto *regReadExpr = NewInPool(exprID++, regIdx, mirFunc->GetPuidx(), ost->GetIndex(), 0); regReadExpr->InitBase(OP_regread, pType, 0); - regMeExprTable.push_back(regReadExpr); return regReadExpr; } @@ -174,7 +170,6 @@ RegMeExpr *IRMap::CreateRegRefMeExpr(MIRType &mirType) { OriginalSt *ost = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); auto *regReadExpr = NewInPool(exprID++, regIdx, mirFunc->GetPuidx(), ost->GetIndex(), 0); regReadExpr->InitBase(OP_regread, mirType.GetPrimType(), 0); - regMeExprTable.push_back(regReadExpr); return regReadExpr; } diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index 70eb616c6b1008854409e6dbadd8fd57ecf071d2..27234a7c660a0cf1ef61cb82121c67a09d954593 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -51,7 +51,6 @@ RegMeExpr *IRMapBuild::GetOrCreateRegFromVerSt(const VersionSt &vst) { irMap->NewInPool(irMap->exprID++, ost->GetPregIdx(), mirModule.CurFunction()->GetPuidx(), ost->GetIndex(), vindex); regx->InitBase(OP_regread, ost->GetMIRPreg()->GetPrimType(), 0); - irMap->regMeExprTable.push_back(regx); irMap->vst2MeExprTable[vindex] = regx; return regx; } diff --git a/src/mapleall/maple_me/src/me_rename2preg.cpp b/src/mapleall/maple_me/src/me_rename2preg.cpp index 3055c43f7a4b8a79db10beb583efbb44576f8603..004f8566e546f92a26eaae33c735b1215179819e 100755 --- a/src/mapleall/maple_me/src/me_rename2preg.cpp +++ b/src/mapleall/maple_me/src/me_rename2preg.cpp @@ -352,7 +352,6 @@ class SSARename2Preg { return irMap.CreateRegMeExprVersion(curRegExpr); }); regPhiNode.GetOpnds().push_back(®Expr); - (void)regExpr.GetPhiUseSet().insert(®PhiNode); } } diff --git a/src/mapleall/maple_me/src/me_store_pre.cpp b/src/mapleall/maple_me/src/me_store_pre.cpp index ddfd0d1da3471076514155832c6b471a0bdfcb67..7db4aaedb25c89b2f72737ab772e633dee5c3713 100755 --- a/src/mapleall/maple_me/src/me_store_pre.cpp +++ b/src/mapleall/maple_me/src/me_store_pre.cpp @@ -115,7 +115,6 @@ RegMeExpr *MeStorePre::EnsureRHSInCurTemp(BB &bb) { RegMeExpr *regPhiOpnd = EnsureRHSInCurTemp(*pred); CHECK_NULL_FATAL(regPhiOpnd); regPhi->GetOpnds().push_back(regPhiOpnd); - (void)regPhiOpnd->GetPhiUseSet().insert(regPhi); } // insert the regPhi (void)bb.GetMePhiList().insert(std::make_pair(lhsReg->GetOstIdx(), regPhi)); diff --git a/src/mapleall/maple_me/src/preg_renamer.cpp b/src/mapleall/maple_me/src/preg_renamer.cpp index 0a29a27fe3ff4948e2fc4aca0ce804a55bfeb1cb..70902ad98d422674458ddf7198d6861c760fdcef 100755 --- a/src/mapleall/maple_me/src/preg_renamer.cpp +++ b/src/mapleall/maple_me/src/preg_renamer.cpp @@ -1,130 +1,113 @@ -/* - * Copyright (c) [2020-2021] Huawei Technologies Co.,Ltd.All rights reserved. - * - * OpenArkCompiler is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR - * FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -#include "preg_renamer.h" #include "alias_class.h" #include "mir_builder.h" #include "me_irmap.h" +#include "preg_renamer.h" +#include "union_find.h" namespace maple { -void PregRenamer::EnqueDefUses(std::list &qu, RegMeExpr *node, std::set &curVisited) const { - CHECK_NULL_FATAL(node); - // get its define - if (node->GetDefBy() == kDefByPhi) { - MePhiNode &defPhi = node->GetDefPhi(); - for (auto it : defPhi.GetOpnds()) { - RegMeExpr *neibNode = static_cast(it); // node's connected register node - if (neibNode != node && curVisited.find(neibNode) == curVisited.end()) { - qu.push_back(neibNode); - (void)curVisited.insert(neibNode); - } - } - } - // get the phi which uses node as an operand - MapleSet &phiUseSet = node->GetPhiUseSet(); - for (auto setIt : phiUseSet) { - MePhiNode *meRegPhi = setIt; - RegMeExpr *lhsReg = static_cast(meRegPhi->GetLHS()); - if (lhsReg != node && curVisited.find(lhsReg) == curVisited.end()) { - qu.push_back(lhsReg); - (void)curVisited.insert(lhsReg); - } - for (auto opdIt : meRegPhi->GetOpnds()) { - RegMeExpr *opndReg = static_cast(opdIt); - if (opndReg != node && curVisited.find(opndReg) == curVisited.end()) { - qu.push_back(opndReg); - (void)curVisited.insert(opndReg); - } - } - } -} void PregRenamer::RunSelf() const { // BFS the graph of register phi node; - std::set curVisited; - const MapleVector ®MeExprTable = irMap->GetRegMeExprTable(); - MIRPregTable *pregTab = func->GetMirFunc()->GetPregTab(); - std::vector firstAppearTable(pregTab->GetPregTable().size()); + std::set curvisited; + const MapleVector ®meexprtable = meirmap->GetVerst2MeExprTable(); + MIRPregTable *pregtab = func->GetMirFunc()->GetPregTab(); + std::vector firstappeartable(pregtab->GetPregTable().size()); uint32 renameCount = 0; - for (auto it : regMeExprTable) { - RegMeExpr *regMeExpr = it; - if (regMeExpr->GetRegIdx() < 0) { - continue; // special register - } - if (curVisited.find(regMeExpr) != curVisited.end()) { + UnionFind unionFind(*mp, regmeexprtable.size()); + // iterate all the bbs' phi to setup the union + for (BB *bb : func->GetAllBBs()) { + if (bb == nullptr || bb == func->GetCommonEntryBB() || bb == func->GetCommonExitBB()) { continue; } - // BFS the node and add all related nodes to the vector; - std::vector candidates; - std::list qu; - qu.push_back(regMeExpr); - candidates.push_back(regMeExpr); - bool useDefFromZeroVersion = false; - bool definedInTryBlock = false; - while (!qu.empty()) { - RegMeExpr *curNode = qu.back(); - qu.pop_back(); - // put all its neighbors into the queue - EnqueDefUses(qu, curNode, curVisited); - (void)curVisited.insert(curNode); - candidates.push_back(curNode); - if (curNode->GetDefBy() == kDefByNo) { - // if any use are from zero version, we stop renaming all the candidates related to it issue #1420 - useDefFromZeroVersion = true; - } else if (curNode->DefByBB() != nullptr && curNode->DefByBB()->GetAttributes(kBBAttrIsTry)) { - definedInTryBlock = true; + MapleMap &mePhiList = bb->GetMePhiList(); + for (MapleMap::iterator it = mePhiList.begin(); + it != mePhiList.end(); it++) { + OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(it->first); + if (!ost->IsPregOst()) { // only handle reg phi + continue; + } + MePhiNode *meRegPhi = it->second; + uint32 vstIdx = meRegPhi->GetLHS()->GetVstIdx(); + uint32 nOpnds = meRegPhi->GetOpnds().size(); + for (uint32 i = 0; i < nOpnds; i++) { + unionFind.Union(vstIdx, meRegPhi->GetOpnd(i)->GetVstIdx()); } } - if (useDefFromZeroVersion || definedInTryBlock) { - continue; // must be zero version. issue #1420 + } + std::map > root2childrenMap; + for (uint32 i = 0; i< regmeexprtable.size(); i++) { + MeExpr *meexpr = regmeexprtable[i]; + if (!meexpr || meexpr->GetMeOp() != kMeOpReg) + continue; + RegMeExpr *regmeexpr = static_cast (meexpr); + if (regmeexpr->GetRegIdx() < 0) { + continue; // special register } + uint32 rootVstidx = unionFind.Root(i); + + std::map>::iterator mpit = root2childrenMap.find(rootVstidx); + if (mpit == root2childrenMap.end()) { + std::vector vec(1, i); + root2childrenMap[rootVstidx] = vec; + } else { + std::vector &vec = mpit->second; + vec.push_back(i); + } + } + + for (std::map >::iterator it = root2childrenMap.begin(); + it != root2childrenMap.end(); it++) { + std::vector &vec = it->second; + bool isIntryOrZerov = false; // in try block or zero version + for (uint32 i = 0; i < vec.size(); i++) { + uint32 vstIdx = vec[i]; + ASSERT(vstIdx < regmeexprtable.size(), "over size"); + RegMeExpr *tregMeexpr = static_cast (regmeexprtable[vstIdx]); + if (tregMeexpr->GetDefBy() == kDefByNo || + tregMeexpr->DefByBB()->GetAttributes(kBBAttrIsTry)) { + isIntryOrZerov = true; + break; + } + + } + if (isIntryOrZerov) + continue; // get all the nodes in candidates the same register - PregIdx newPregIdx = regMeExpr->GetRegIdx(); - ASSERT(static_cast(newPregIdx) < firstAppearTable.size(), "oversize "); - if (!firstAppearTable[newPregIdx]) { + RegMeExpr *regMeexpr = static_cast(regmeexprtable[it->first]); + PregIdx16 newpregidx = regMeexpr->GetRegIdx(); + ASSERT(static_cast(newpregidx) < firstappeartable.size(), "oversize "); + if (!firstappeartable[newpregidx]) { // use the previous register - firstAppearTable[newPregIdx] = true; + firstappeartable[newpregidx] = true; continue; } - newPregIdx = (regMeExpr->GetPrimType() == PTY_ref) ? - pregTab->CreatePreg(PTY_ref, pregTab->PregFromPregIdx(regMeExpr->GetRegIdx())->GetMIRType()) : - pregTab->CreatePreg(regMeExpr->GetPrimType()); - ++renameCount; - if (enabledDebug) { - LogInfo::MapleLogger() << "%" << - pregTab->PregFromPregIdx(static_cast(regMeExpr->GetRegIdx()))->GetPregNo(); - LogInfo::MapleLogger() << " renamed to %" << pregTab->PregFromPregIdx(newPregIdx)->GetPregNo() << '\n'; + newpregidx = pregtab->ClonePreg(*pregtab->PregFromPregIdx(regMeexpr->GetRegIdx())); + renameCount++; + if (DEBUGFUNC(func)) { + std::cout << "%" << pregtab->PregFromPregIdx(static_cast(regMeexpr->GetRegIdx()))->GetPregNo(); + std::cout << " renamed to %" << pregtab->PregFromPregIdx(static_cast(newpregidx))->GetPregNo() << std::endl; } // reneme all the register - for (auto candiIt : candidates) { - RegMeExpr *candiRegNode = candiIt; - candiRegNode->SetRegIdx(newPregIdx); // rename it to a new register - } - if (renameCount == MeOption::pregRenameLimit) { - break; + for (uint32 i = 0; i < vec.size(); i++) { + RegMeExpr *canregnode = static_cast (regmeexprtable[vec[i]]); + // std::cout << "rename %"<< canregnode->regidx << "to %" << newpregidx << std::endl; + canregnode->SetRegIdx(newpregidx); // rename it to a new register } } } -AnalysisResult *MeDoPregRename::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr*) { - auto *irMap = static_cast(m->GetAnalysisResult(MeFuncPhase_IRMAPBUILD, func)); - PregRenamer pregRenamer(*NewMemPool(), *func, *irMap, DEBUGFUNC(func)); - pregRenamer.RunSelf(); +AnalysisResult *MeDoPregRename::Run(MeFunction *func, MeFuncResultMgr *m, ModuleResultMgr *mrm) { + MeIRMap *irmap = static_cast(m->GetAnalysisResult(MeFuncPhase_IRMAPBUILD, func)); + std::string renamePhaseName = PhaseName(); + MemPool *renamemp = memPoolCtrler.NewMemPool(renamePhaseName); + PregRenamer pregrenamer(renamemp, func, irmap); + pregrenamer.RunSelf(); if (DEBUGFUNC(func)) { - LogInfo::MapleLogger() << "------------after pregrename:-------------------\n"; - func->Dump(false); + std::cout << "------------after pregrename:-------------------\n"; + func->Dump(); } + memPoolCtrler.DeleteMemPool(renamemp); return nullptr; } + } // namespace maple diff --git a/src/mapleall/maple_me/src/ssa_pre.cpp b/src/mapleall/maple_me/src/ssa_pre.cpp index 88dd45cf316af9fa18e7882088dc6a2eb0fe4aca..4991c55cffda7abb058a23e25b8592ef3245c2b4 100755 --- a/src/mapleall/maple_me/src/ssa_pre.cpp +++ b/src/mapleall/maple_me/src/ssa_pre.cpp @@ -187,7 +187,6 @@ void SSAPre::UpdateInsertedPhiOccOpnd() { regOpnd = irMap->CreateRegMeExprVersion(static_cast(*curTemp)); } phiReg->GetOpnds().push_back(regOpnd); - (void)regOpnd->GetPhiUseSet().insert(phiReg); // record all the uses phi node for preg renaming } (void)phiOcc->GetBB()->GetMePhiList().insert(std::make_pair(phiReg->GetOpnd(0)->GetOstIdx(), phiReg)); if (workCand->NeedLocalRefVar() && phiOcc->GetVarPhi() != nullptr) {