From a60a9c8ff9c0d2af5e6bc6f0c6afe66bc7b0f2b6 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 27 Apr 2021 08:49:40 -0700 Subject: [PATCH] implemented FindOrCreateAliasElemOfAddrofZeroFieldIDOSt() so the OriginalSt created can cover entire struct --- .../maple_me/include/alias_analysis_table.h | 2 ++ src/mapleall/maple_me/include/alias_class.h | 1 + src/mapleall/maple_me/src/alias_class.cpp | 33 +++++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_me/include/alias_analysis_table.h b/src/mapleall/maple_me/include/alias_analysis_table.h index 46ca594014..6c02e20b8a 100644 --- a/src/mapleall/maple_me/include/alias_analysis_table.h +++ b/src/mapleall/maple_me/include/alias_analysis_table.h @@ -41,7 +41,9 @@ class AliasAnalysisTable { OriginalSt *FindExtraLevOriginalSt(const MapleVector &nextLevelOsts, FieldID fld); SSATab &ssaTab; MapleAllocator alloc; + public: MapleMap prevLevelNode; // index is the OStIdx + private: MapleMap*> nextLevelNodes; // index is the OStIdx MemPool *memPool; KlassHierarchy &klassHierarchy; diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 18c6beb982..645bf1e93e 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -191,6 +191,7 @@ class AliasClass : public AnalysisResult { AliasElem *FindOrCreateDummyNADSAe(); bool IsPointedTo(OriginalSt &oSt); AliasElem &FindOrCreateAliasElemOfAddrofOSt(OriginalSt &oSt); + AliasElem &FindOrCreateAliasElemOfAddrofZeroFieldIDOSt(OriginalSt &oSt); void CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts); void CollectMayUseForNextLevel(const OriginalSt *ost, std::set &mayUseOsts, const StmtNode &stmt, bool isFirstOpnd); diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 259a6a8e0b..e65e597938 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -188,6 +188,25 @@ AliasElem &AliasClass::FindOrCreateAliasElemOfAddrofOSt(OriginalSt &oSt) { return *FindOrCreateAliasElem(*addrofOst); } +AliasElem &AliasClass::FindOrCreateAliasElemOfAddrofZeroFieldIDOSt(OriginalSt &ost) { + OriginalSt *zeroFieldIDOst = ssaTab.FindOrCreateSymbolOriginalSt(*ost.GetMIRSymbol(), ost.GetPuIdx(), 0); + if (zeroFieldIDOst->GetIndex() == osym2Elem.size()) { + osym2Elem.push_back(nullptr); + ssaTab.GetVersionStTable().CreateZeroVersionSt(zeroFieldIDOst); + } + FindOrCreateAliasElem(*zeroFieldIDOst); + + OriginalSt *addrofOst = GetAliasAnalysisTable()->FindOrCreateAddrofSymbolOriginalSt(*zeroFieldIDOst); + if (ost.GetFieldID() != 0) { + GetAliasAnalysisTable()->prevLevelNode.insert(std::make_pair(ost.GetIndex(), addrofOst)); + GetAliasAnalysisTable()->GetNextLevelNodes(*addrofOst)->push_back(&ost); + } + if (addrofOst->GetIndex() == osym2Elem.size()) { + osym2Elem.push_back(nullptr); + } + return *FindOrCreateAliasElem(*addrofOst); +} + AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { switch (expr.GetOpCode()) { case OP_addrof: { @@ -199,8 +218,12 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { return AliasInfo(ae, addrof.GetFieldID()); } case OP_dread: { - OriginalSt &ost = *static_cast(expr).GetSSAVar()->GetOst(); - AliasElem *ae = FindOrCreateAliasElem(ost); + OriginalSt *ost = static_cast(expr).GetSSAVar()->GetOst(); + if (ost->GetFieldID() != 0) { + FindOrCreateAliasElemOfAddrofZeroFieldIDOSt(*ost); + } + + AliasElem *ae = FindOrCreateAliasElem(*ost); return AliasInfo(ae, 0); } case OP_regread: { @@ -335,6 +358,10 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { AliasInfo rhsAinfo = CreateAliasElemsExpr(*stmt.Opnd(0)); // LHS OriginalSt *ost = ssaTab.GetStmtsSSAPart().GetAssignedVarOf(stmt)->GetOst(); + if (ost->GetFieldID() != 0) { + FindOrCreateAliasElemOfAddrofZeroFieldIDOSt(*ost); + } + AliasElem *lhsAe = FindOrCreateAliasElem(*ost); ASSERT_NOT_NULL(lhsAe); ApplyUnionForDassignCopy(*lhsAe, rhsAinfo.ae, *stmt.Opnd(0)); @@ -751,6 +778,8 @@ void AliasClass::ApplyUnionForStorageOverlaps() { if (mirType->GetKind() != kTypePointer) { continue; } + + // work on the next indirect level auto nextLevOsts = GetAliasAnalysisTable()->GetNextLevelNodes(*ost); if (nextLevOsts == nullptr) { continue; -- Gitee