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 49b96677c2f75a903718ac2f1fb10c6d5d1a87bd..2d04dc7b16b5b36cb40fe566e8d3a0a8723558c6 --- a/src/mapleall/maple_me/include/me_ir.h +++ b/src/mapleall/maple_me/include/me_ir.h @@ -308,9 +308,8 @@ class ScalarMeExpr : public MeExpr { // represant dread class VarMeExpr final : public ScalarMeExpr { public: - VarMeExpr(MapleAllocator *alloc, int32 exprid, OriginalSt *ost, size_t vidx, PrimType ptyp) - : ScalarMeExpr(exprid, ost, vidx, kMeOpVar, OP_dread, ptyp), - inferredTypeCandidates(alloc->Adapter()) {} + VarMeExpr(int32 exprid, OriginalSt *ost, size_t vidx, PrimType ptyp) + : ScalarMeExpr(exprid, ost, vidx, kMeOpVar, OP_dread, ptyp) {} ~VarMeExpr() = default; @@ -333,19 +332,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; } @@ -374,7 +360,6 @@ class VarMeExpr final : public ScalarMeExpr { bool noDelegateRC = false; // true if this cannot be optimized by delegaterc bool noSubsumeRC = false; // true if this cannot be optimized by subsumrc 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 c57ecebc35e15aad4d55a3c4d92838ab01a6292f..31b200ddd2c94c2c757f7796066ad0fb9c8f18e6 --- 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 1030f3814877ec12288b9629ca9e1eb0e8f4c189..cb2f7b11b3336b5523b3f173fe408bb3a6daf51e 100644 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -19,7 +19,8 @@ namespace maple { VarMeExpr *IRMap::CreateVarMeExprVersion(const VarMeExpr &origExpr) { - auto *varMeExpr = New(&irMapAlloc, exprID++, origExpr.GetOst(), vst2MeExprTable.size(), origExpr.GetPrimType()); + auto *varMeExpr = New(exprID++, origExpr.GetOst(), + vst2MeExprTable.size(), origExpr.GetPrimType()); vst2MeExprTable.push_back(varMeExpr); return varMeExpr; } @@ -75,7 +76,7 @@ MeExpr *IRMap::CreateIvarMeExpr(MeExpr &expr, TyIdx tyIdx, MeExpr &base) { } VarMeExpr *IRMap::CreateNewVarMeExpr(OriginalSt *ost, PrimType pType) { - VarMeExpr *varMeExpr = New(&GetIRMapAlloc(), exprID++, ost, vst2MeExprTable.size(), pType); + VarMeExpr *varMeExpr = New(exprID++, ost, vst2MeExprTable.size(), pType); PushBackVerst2MeExprTable(varMeExpr); return varMeExpr; } @@ -85,7 +86,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, oSt->GetZeroVersionIndex(), pType); + auto *varx = New(exprID++, oSt, oSt->GetZeroVersionIndex(), pType); return varx; } @@ -97,7 +98,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, vst2MeExprTable.size(), PTY_ref); + auto *newLocalRefVar = New(exprID++, oSt, vst2MeExprTable.size(), PTY_ref); vst2MeExprTable.push_back(newLocalRefVar); return newLocalRefVar; } @@ -196,7 +197,8 @@ VarMeExpr *IRMap::GetOrCreateZeroVersionVarMeExpr(OriginalSt &ost) { vst2MeExprTable.push_back(nullptr); } if (vst2MeExprTable[ost.GetZeroVersionIndex()] == nullptr) { - auto *varMeExpr = NewInPool(exprID++, &ost, ost.GetZeroVersionIndex(), GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost.GetTyIdx())->GetPrimType()); + auto *varMeExpr = New(exprID++, &ost, ost.GetZeroVersionIndex(), + GlobalTables::GetTypeTable().GetTypeFromTyIdx(ost.GetTyIdx())->GetPrimType()); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); vst2MeExprTable[ost.GetZeroVersionIndex()] = varMeExpr; return varMeExpr; diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index 817f87b551b0809d903138e8cb580122c6903f9d..b549761f50fc6761a50849ea2c899d9ebd48ecac 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -31,8 +31,8 @@ VarMeExpr *IRMapBuild::GetOrCreateVarFromVerSt(VersionSt &vst) { } OriginalSt *ost = vst.GetOst(); ASSERT(ost->IsSymbolOst(), "GetOrCreateVarFromVerSt: wrong ost_type"); - auto *varx = irMap->NewInPool(irMap->exprID++, ost, vindex, - GlobalTables::GetTypeTable().GetTypeTable()[ost->GetTyIdx().GetIdx()]->GetPrimType()); + auto *varx = irMap->New(irMap->exprID++, ost, vindex, + GlobalTables::GetTypeTable().GetTypeTable()[ost->GetTyIdx().GetIdx()]->GetPrimType()); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); irMap->vst2MeExprTable[vindex] = varx; return varx; diff --git a/src/mapleall/maple_me/src/me_ssi.cpp b/src/mapleall/maple_me/src/me_ssi.cpp index 6dbc9cf5c6b1a5fb96bfb4eda1cebc82c959eb12..bd6709df0efeee4d53085be93204a7338fd6354a 100644 --- a/src/mapleall/maple_me/src/me_ssi.cpp +++ b/src/mapleall/maple_me/src/me_ssi.cpp @@ -27,8 +27,8 @@ VarMeExpr *MeSSI::CreateNewPiExpr(const MeExpr &opnd) { OriginalSt *ost = static_cast(&opnd)->GetOst(); CHECK_NULL_FATAL(ost); CHECK_FATAL(!ost->IsVolatile(), "must be"); - VarMeExpr *var = irMap->NewInPool(irMap->GetExprID(), ost, - irMap->GetVerst2MeExprTable().size(), opnd.GetPrimType()); + VarMeExpr *var = irMap->New(irMap->GetExprID(), ost, + irMap->GetVerst2MeExprTable().size(), opnd.GetPrimType()); irMap->SetExprID(irMap->GetExprID() + 1); irMap->PushBackVerst2MeExprTable(var); ost->PushbackVersionIndex(var->GetVstIdx()); 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 8023c01c04913b9b193a83d996d5f5d984648ce2..d0f7ac6743c668dbeb234a06902161090d9c21a9 --- 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; } }