From 1861d7d2b743d6153fb39f8f4087d53b56e89635 Mon Sep 17 00:00:00 2001 From: Frederick Chow Date: Mon, 8 Feb 2021 22:45:34 -0800 Subject: [PATCH] Replaced inferredTypeCandidates from VarMeExpr by a map local to the ssadevirt phase As a result, VarMeExpr's constructor does not need mempool parameter any more. --- src/mapleall/maple_me/include/me_ir.h | 19 ++----------------- src/mapleall/maple_me/include/ssa_devirtual.h | 4 +++- src/mapleall/maple_me/src/irmap.cpp | 10 +++++----- src/mapleall/maple_me/src/irmap_build.cpp | 2 +- src/mapleall/maple_me/src/me_ssi.cpp | 2 +- src/mapleall/maple_me/src/ssa_devirtual.cpp | 18 ++++++++++++------ 6 files changed, 24 insertions(+), 31 deletions(-) mode change 100755 => 100644 src/mapleall/maple_me/include/me_ir.h mode change 100755 => 100644 src/mapleall/maple_me/include/ssa_devirtual.h mode change 100755 => 100644 src/mapleall/maple_me/src/ssa_devirtual.cpp diff --git a/src/mapleall/maple_me/include/me_ir.h b/src/mapleall/maple_me/include/me_ir.h old mode 100755 new mode 100644 index 4ef064ba4e..e7924efe51 --- a/src/mapleall/maple_me/include/me_ir.h +++ b/src/mapleall/maple_me/include/me_ir.h @@ -312,9 +312,8 @@ class ScalarMeExpr : public MeExpr { // represant dread class VarMeExpr final : public ScalarMeExpr { public: - VarMeExpr(MapleAllocator *alloc, int32 exprid, OStIdx oidx, size_t vidx, PrimType ptyp) - : ScalarMeExpr(exprid, oidx, vidx, kMeOpVar, OP_dread, ptyp), - inferredTypeCandidates(alloc->Adapter()) {} + VarMeExpr(int32 exprid, OStIdx oidx, size_t vidx, PrimType ptyp) + : ScalarMeExpr(exprid, oidx, vidx, kMeOpVar, OP_dread, ptyp) {} ~VarMeExpr() = default; @@ -345,19 +344,6 @@ class VarMeExpr final : public ScalarMeExpr { void SetInferredTyIdx(TyIdx inferredTyIdxVal) { inferredTyIdx = inferredTyIdxVal; } - - const MapleVector &GetInferredTypeCandidates() const { - return inferredTypeCandidates; - } - - void AddInferredTypeCandidate(TyIdx idx) { - inferredTypeCandidates.push_back(idx); - } - - void ClearInferredTypeCandidates() { - inferredTypeCandidates.clear(); - } - bool GetMaybeNull() const { return maybeNull; } @@ -387,7 +373,6 @@ class VarMeExpr final : public ScalarMeExpr { bool noSubsumeRC = false; // true if this cannot be optimized by subsumrc FieldID fieldID = 0; TyIdx inferredTyIdx{ 0 }; /* Non zero if it has a known type (allocation type is seen). */ - MapleVector inferredTypeCandidates; bool maybeNull = true; // false if definitely not null }; diff --git a/src/mapleall/maple_me/include/ssa_devirtual.h b/src/mapleall/maple_me/include/ssa_devirtual.h old mode 100755 new mode 100644 index c57ecebc35..31b200ddd2 --- a/src/mapleall/maple_me/include/ssa_devirtual.h +++ b/src/mapleall/maple_me/include/ssa_devirtual.h @@ -33,6 +33,7 @@ class SSADevirtual { kh(&currKh), dom(&currDom), bbVisited(bbVecSize, false, devirtualAlloc.Adapter()), + inferredTypeCandidatesMap(devirtualAlloc.Adapter()), clone(nullptr), retTy(kNotSeen), inferredRetTyIdx(0), @@ -63,7 +64,7 @@ class SSADevirtual { virtual BB *GetBB(BBId id) const = 0; void TraversalBB(BB*); void TraversalMeStmt(MeStmt &Stmt); - void VisitVarPhiNode(MePhiNode&) const; + void VisitVarPhiNode(MePhiNode&); void VisitMeExpr(MeExpr*) const; void PropVarInferredType(VarMeExpr&) const; void PropIvarInferredType(IvarMeExpr&) const; @@ -82,6 +83,7 @@ class SSADevirtual { KlassHierarchy *kh; Dominance *dom; MapleVector bbVisited; // needed because dominator tree is a DAG in wpo + MapleMap*> inferredTypeCandidatesMap; // key is VarMeExpr's exprID Clone *clone; enum TagRetTyIdx { kNotSeen, diff --git a/src/mapleall/maple_me/src/irmap.cpp b/src/mapleall/maple_me/src/irmap.cpp index b0ba280370..322c8b7b08 100644 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -19,7 +19,7 @@ namespace maple { VarMeExpr *IRMap::CreateVarMeExprVersion(const VarMeExpr &origExpr) { - auto *varMeExpr = New(&irMapAlloc, exprID++, origExpr.GetOStIdx(), + auto *varMeExpr = New(exprID++, origExpr.GetOStIdx(), vst2MeExprTable.size(), origExpr.GetPrimType()); vst2MeExprTable.push_back(varMeExpr); varMeExpr->SetFieldID(origExpr.GetFieldID()); @@ -77,7 +77,7 @@ MeExpr *IRMap::CreateIvarMeExpr(MeExpr &expr, TyIdx tyIdx, MeExpr &base) { } VarMeExpr *IRMap::CreateNewVarMeExpr(OStIdx ostIdx, PrimType pType, FieldID fieldID) { - VarMeExpr *varMeExpr = New(&GetIRMapAlloc(), exprID++, ostIdx, vst2MeExprTable.size(), pType); + VarMeExpr *varMeExpr = New(exprID++, ostIdx, vst2MeExprTable.size(), pType); varMeExpr->SetFieldID(fieldID); PushBackVerst2MeExprTable(varMeExpr); return varMeExpr; @@ -94,7 +94,7 @@ VarMeExpr *IRMap::CreateNewGlobalTmp(GStrIdx strIdx, PrimType pType) { mirModule.GetMIRBuilder()->CreateSymbol((TyIdx)pType, strIdx, kStVar, kScGlobal, nullptr, kScopeGlobal); st->SetIsTmp(true); OriginalSt *oSt = ssaTab.CreateSymbolOriginalSt(*st, 0, 0); - auto *varx = New(&irMapAlloc, exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex(), pType); + auto *varx = New(exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex(), pType); return varx; } @@ -106,7 +106,7 @@ VarMeExpr *IRMap::CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx) { oSt->SetZeroVersionIndex(vst2MeExprTable.size()); vst2MeExprTable.push_back(nullptr); oSt->PushbackVersionIndex(oSt->GetZeroVersionIndex()); - auto *newLocalRefVar = New(&irMapAlloc, exprID++, oSt->GetIndex(), vst2MeExprTable.size(), PTY_ref); + auto *newLocalRefVar = New(exprID++, oSt->GetIndex(), vst2MeExprTable.size(), PTY_ref); vst2MeExprTable.push_back(newLocalRefVar); return newLocalRefVar; } @@ -208,7 +208,7 @@ VarMeExpr *IRMap::GetOrCreateZeroVersionVarMeExpr(const OriginalSt &ost) { vst2MeExprTable.push_back(nullptr); } if (vst2MeExprTable[ost.GetZeroVersionIndex()] == nullptr) { - auto *varMeExpr = New(&irMapAlloc, exprID++, ost.GetIndex(), ost.GetZeroVersionIndex(), + auto *varMeExpr = New(exprID++, ost.GetIndex(), ost.GetZeroVersionIndex(), GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost.GetTyIdx())->GetPrimType()); varMeExpr->SetFieldID(ost.GetFieldID()); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index 0b34fdb9c9..6d2d7b63ee 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -32,7 +32,7 @@ VarMeExpr *IRMapBuild::GetOrCreateVarFromVerSt(const VersionSt &vst) { const OriginalSt *ost = vst.GetOrigSt(); ASSERT(ost->IsSymbolOst(), "GetOrCreateVarFromVerSt: wrong ost_type"); PrimType primType = GlobalTables::GetTypeTable().GetTypeTable()[ost->GetTyIdx().GetIdx()]->GetPrimType(); - auto *varx = irMap->New(&irMap->irMapAlloc, irMap->exprID++, ost->GetIndex(), vindex, primType); + auto *varx = irMap->New(irMap->exprID++, ost->GetIndex(), vindex, primType); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); varx->SetFieldID(ost->GetFieldID()); irMap->vst2MeExprTable[vindex] = varx; diff --git a/src/mapleall/maple_me/src/me_ssi.cpp b/src/mapleall/maple_me/src/me_ssi.cpp index 4a389699ee..fd10fce21d 100644 --- a/src/mapleall/maple_me/src/me_ssi.cpp +++ b/src/mapleall/maple_me/src/me_ssi.cpp @@ -28,7 +28,7 @@ VarMeExpr *MeSSI::CreateNewPiExpr(const MeExpr &opnd) { OriginalSt *ost = ssaTab.GetOriginalStFromID(static_cast(&opnd)->GetOStIdx()); CHECK_NULL_FATAL(ost); CHECK_FATAL(!ost->IsVolatile(), "must be"); - VarMeExpr *var = irMap->NewInPool(irMap->GetExprID(), ost->GetIndex(), + VarMeExpr *var = irMap->New(irMap->GetExprID(), ost->GetIndex(), irMap->GetVerst2MeExprTable().size(), opnd.GetPrimType()); irMap->SetExprID(irMap->GetExprID() + 1); irMap->PushBackVerst2MeExprTable(var); diff --git a/src/mapleall/maple_me/src/ssa_devirtual.cpp b/src/mapleall/maple_me/src/ssa_devirtual.cpp old mode 100755 new mode 100644 index 24237ed91f..b16607a755 --- a/src/mapleall/maple_me/src/ssa_devirtual.cpp +++ b/src/mapleall/maple_me/src/ssa_devirtual.cpp @@ -187,8 +187,9 @@ bool SSADevirtual::DevirtualizeCall(CallMeStmt &callStmt) { } else { if (thisParm->GetMeOp() == kMeOpVar) { auto *varMeExpr = static_cast(thisParm); - const MapleVector inferredTypeCandidates = varMeExpr->GetInferredTypeCandidates(); - if (inferredTypeCandidates.size() > 0) { + MapleMap*>::iterator mapit = inferredTypeCandidatesMap.find(varMeExpr->GetExprID()); + if (mapit != inferredTypeCandidatesMap.end() && mapit->second->size() > 0) { + const MapleVector &inferredTypeCandidates = *mapit->second; GStrIdx funcName = mirFunc.GetBaseFuncNameWithTypeStrIdx(); MIRFunction *inferredFunction = nullptr; size_t i = 0; @@ -339,7 +340,7 @@ void SSADevirtual::PropIvarInferredType(IvarMeExpr &ivar) const { } } -void SSADevirtual::VisitVarPhiNode(MePhiNode &varPhi) const { +void SSADevirtual::VisitVarPhiNode(MePhiNode &varPhi) { MapleVector opnds = varPhi.GetOpnds(); auto *lhs = varPhi.GetLHS(); // RegPhiNode cases NYI @@ -348,7 +349,12 @@ void SSADevirtual::VisitVarPhiNode(MePhiNode &varPhi) const { } VarMeExpr *lhsVar = static_cast(varPhi.GetLHS()); - const MapleVector &inferredTypeCandidates = lhsVar->GetInferredTypeCandidates(); + auto mapit = inferredTypeCandidatesMap.find(lhsVar->GetExprID()); + if (mapit == inferredTypeCandidatesMap.end()) { + MapleVector *tyIdxCandidates = devirtualAlloc.GetMemPool()->New>(devirtualAlloc.Adapter()); + inferredTypeCandidatesMap[lhsVar->GetExprID()] = tyIdxCandidates; + } + MapleVector &inferredTypeCandidates = *inferredTypeCandidatesMap[lhsVar->GetExprID()]; for (size_t i = 0; i < opnds.size(); ++i) { VarMeExpr *opnd = static_cast(opnds[i]); PropVarInferredType(*opnd); @@ -360,10 +366,10 @@ void SSADevirtual::VisitVarPhiNode(MePhiNode &varPhi) const { } } if (j == inferredTypeCandidates.size()) { - lhsVar->AddInferredTypeCandidate(opnd->GetInferredTyIdx()); + inferredTypeCandidates.push_back(opnd->GetInferredTyIdx()); } } else { - lhsVar->ClearInferredTypeCandidates(); + inferredTypeCandidates.clear(); break; } } -- Gitee