From 32ad2dd21e5b7af398f05d4e0aef9bcae11e372b Mon Sep 17 00:00:00 2001 From: "@evian_hill" Date: Sat, 17 Jul 2021 11:48:01 +0800 Subject: [PATCH 1/2] union alias-elements of next-level-osts of aliased-osts --- src/mapleall/maple_me/include/alias_class.h | 9 +- src/mapleall/maple_me/src/alias_class.cpp | 147 +++++++++++++------ src/mapleall/maple_me/src/me_alias_class.cpp | 2 - 3 files changed, 110 insertions(+), 48 deletions(-) diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 9486b5d3f5..ea36db4ec0 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -108,7 +108,8 @@ class AliasClass : public AnalysisResult { acMemPool(memPool), acAlloc(&memPool), ssaTab(ssaTabParam), - unionFind(memPool), + unionFindAssignSet(memPool), + unionFindAliasSet(memPool), osym2Elem(ssaTabParam.GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), id2Elem(acAlloc.Adapter()), notAllDefsSeenClassSetRoots(acAlloc.Adapter()), @@ -144,7 +145,8 @@ class AliasClass : public AnalysisResult { } void ReinitUnionFind() { - unionFind.Reinit(); + unionFindAssignSet.Reinit(); + unionFindAliasSet.Reinit(); } void ApplyUnionForCopies(StmtNode &stmt); @@ -233,7 +235,8 @@ class AliasClass : public AnalysisResult { MemPool &acMemPool; MapleAllocator acAlloc; SSATab &ssaTab; - UnionFind unionFind; + UnionFind unionFindAssignSet; + UnionFind unionFindAliasSet; MapleVector osym2Elem; // index is OStIdx MapleVector id2Elem; // index is the id MapleVector notAllDefsSeenClassSetRoots; // root of the not_all_defs_seen class sets diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 17715670c7..28f61ce51c 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -171,7 +171,8 @@ AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt &ost) { } id2Elem.push_back(aliasElem); osym2Elem[ostIdx] = aliasElem; - unionFind.NewMember(); + unionFindAssignSet.NewMember(); + unionFindAliasSet.NewMember(); return aliasElem; } @@ -338,7 +339,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { auto *opnd = expr.Opnd(1); if (!opnd->IsConstval() || !IsAddress(expr.GetPrimType())) { - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, OffsetType::InvalidOffset()); + return AliasInfo(aliasInfo.ae, 0, OffsetType::InvalidOffset()); } auto mirConst = static_cast(opnd)->GetConstVal(); CHECK_FATAL(mirConst->GetKind() == kConstInt, "array index must be integer"); @@ -350,7 +351,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { } constexpr int64 bitsPerByte = 8; OffsetType newOffset = aliasInfo.offset + constVal * bitsPerByte; - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, newOffset); + return AliasInfo(aliasInfo.ae, 0, newOffset); } case OP_array: { for (size_t i = 1; i < expr.NumOpnds(); ++i) { @@ -458,7 +459,7 @@ void AliasClass::ApplyUnionForFieldsInAggCopy(const OriginalSt *lhsost, const Or } AliasElem *aeOfLHSField = FindOrCreateAliasElem(*lhsFieldOst); AliasElem *aeOfRHSField = FindOrCreateAliasElem(*rhsFieldOst); - unionFind.Union(aeOfLHSField->id, aeOfRHSField->id); + unionFindAssignSet.Union(aeOfLHSField->id, aeOfRHSField->id); } } else if (lhsost->GetIndirectLev() == 0) { // make any field in this struct that has appeared NADS @@ -552,6 +553,7 @@ void AliasClass::ApplyUnionForDassignCopy(AliasElem &lhsAe, AliasElem *rhsAe, Ba return; } if (rhsAe == nullptr || rhsAe->GetOriginalSt().GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { + unionFindAssignSet.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); lhsAe.SetNextLevNotAllDefsSeen(true); return; } @@ -570,7 +572,7 @@ void AliasClass::ApplyUnionForDassignCopy(AliasElem &lhsAe, AliasElem *rhsAe, Ba (rhs.GetOpCode() == OP_addrof && IsReadOnlyOst(rhsAe->GetOriginalSt()))) { return; } - unionFind.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); + unionFindAssignSet.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); } void AliasClass::SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *aliasElem, bool hasNoPrivateDefEffect) { @@ -612,7 +614,7 @@ void AliasClass::CreateMirroringAliasElems(const OriginalSt *ost1, OriginalSt *o ssaTab.GetVersionStTable().CreateZeroVersionSt(nextLevelOst2); } AliasElem *ae2 = FindOrCreateAliasElem(*nextLevelOst2); - unionFind.Union(ae1->GetClassID(), ae2->GetClassID()); + unionFindAssignSet.Union(ae1->GetClassID(), ae2->GetClassID()); CreateMirroringAliasElems(nextLevelOst1, nextLevelOst2); // recursive call } } @@ -633,13 +635,6 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { AliasElem *lhsAe = FindOrCreateAliasElem(*ost); ASSERT_NOT_NULL(lhsAe); ApplyUnionForDassignCopy(*lhsAe, rhsAinfo.ae, *stmt.Opnd(0)); - // at p = x, if the next level of either side exists, create other - // side's next level - if (mirModule.IsCModule() && rhsAinfo.ae && - (lhsAe->GetOriginalSt().GetTyIdx() == rhsAinfo.ae->GetOriginalSt().GetTyIdx())) { - CreateMirroringAliasElems(&rhsAinfo.ae->GetOriginalSt(), &lhsAe->GetOriginalSt()); - CreateMirroringAliasElems(&lhsAe->GetOriginalSt(), &rhsAinfo.ae->GetOriginalSt()); - } return; } case OP_iassign: { @@ -749,7 +744,7 @@ void AliasClass::UnionAddrofOstOfUnionFields() { StIdx stIdx = ost.GetMIRSymbol()->GetStIdx(); auto it = sym2AddrofOstAE.find(stIdx); if (it != sym2AddrofOstAE.end()) { - unionFind.Union(it->second->id, aliasElem->id); + unionFindAssignSet.Union(it->second->id, aliasElem->id); } else { sym2AddrofOstAE[stIdx] = aliasElem; } @@ -760,8 +755,8 @@ void AliasClass::CreateAssignSets() { // iterate through all the alias elems for (auto *aliasElem : id2Elem) { unsigned int id = aliasElem->GetClassID(); - unsigned int rootID = unionFind.Root(id); - if (unionFind.GetElementsNumber(rootID) > 1) { + unsigned int rootID = unionFindAssignSet.Root(id); + if (unionFindAssignSet.GetElementsNumber(rootID) > 1) { // only root id's have assignset if (id2Elem[rootID]->GetAssignSet() == nullptr) { id2Elem[rootID]->assignSet = acMemPool.New>(acAlloc.Adapter()); @@ -774,7 +769,7 @@ void AliasClass::CreateAssignSets() { void AliasClass::DumpAssignSets() { LogInfo::MapleLogger() << "/////// assign sets ///////\n"; for (auto *aliasElem : id2Elem) { - if (unionFind.Root(aliasElem->GetClassID()) != aliasElem->GetClassID()) { + if (unionFindAssignSet.Root(aliasElem->GetClassID()) != aliasElem->GetClassID()) { continue; } @@ -802,7 +797,7 @@ void AliasClass::UnionAllPointedTos() { } } for (size_t i = 1; i < pointedTos.size(); ++i) { - unionFind.Union(pointedTos[0]->GetClassID(), pointedTos[i]->GetClassID()); + unionFindAliasSet.Union(pointedTos[0]->GetClassID(), pointedTos[i]->GetClassID()); } } // process the union among the pointed's of assignsets @@ -825,7 +820,7 @@ void AliasClass::ApplyUnionForPointedTos() { } } } - }; + } // only for c language // base ptr may add/sub an offset to point to any field if (mirModule.IsCModule()) { @@ -872,6 +867,7 @@ void AliasClass::ApplyUnionForPointedTos() { } // apply union among the assignSet elements + std::set aesToUnionNextLev; tempset = *(aliaselem->GetAssignSet()); while (tempset.size() > 1) { // At least two elements in the same assignSet so that we can connect their next level // pick one alias element @@ -888,9 +884,73 @@ void AliasClass::ApplyUnionForPointedTos() { if (!MayAliasBasicAA(*ost1it, *ost2it)) { continue; } - AliasElem *indae1 = FindAliasElem(**ost1it); - AliasElem *indae2 = FindAliasElem(**ost2it); - unionFind.Union(indae1->GetClassID(), indae2->GetClassID()); + uint32 idA = FindAliasElem(**ost1it)->GetClassID(); + uint32 idB = FindAliasElem(**ost2it)->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet.Root(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } + } + } + } + } + + // union next-level-osts of aliased osts + while (!aesToUnionNextLev.empty()) { + auto tmpSet = aesToUnionNextLev; + aesToUnionNextLev.clear(); + for (auto *aliasElem : tmpSet) { + auto aeId = aliasElem->GetClassID(); + if (unionFindAliasSet.Root(aeId) != aeId) { + continue; + } + + std::set mayAliasOsts; + for (uint32 id = 0; id < id2Elem.size(); ++id) { + if (unionFindAliasSet.Root(id) != aeId) { + continue; + } + auto *ost = id2Elem[id]->GetOst(); + auto &nextLevOsts = ost->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + + auto rootIdInAssignSet = unionFindAssignSet.Root(id); + auto *assignSet = id2Elem[rootIdInAssignSet]->GetAssignSet(); + if (assignSet == nullptr) { + continue; + } + for (auto valAliasId : *assignSet) { + if (valAliasId == id) { + continue; + } + auto &nextLevOsts = id2Elem[valAliasId]->GetOst()->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + } + } + + if (mayAliasOsts.empty()) { + continue; + } + + for (auto itA = mayAliasOsts.begin(); itA != mayAliasOsts.end(); ++itA) { + auto *ostA = *itA; + if (ostA->IsFinal()) { + continue; + } + auto itB = itA; + ++itB; + for (; itB != mayAliasOsts.end(); ++itB) { + auto *ostB = *itB; + if (ostB->IsFinal()) { + continue; + } + + auto idA = FindAliasElem(*ostA)->GetClassID(); + auto idB = FindAliasElem(*ostB)->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } } } } @@ -903,7 +963,7 @@ void AliasClass::CollectRootIDOfNextLevelNodes(const OriginalSt &ost, for (OriginalSt *nextLevelNode : ost.GetNextLevelOsts()) { if (!nextLevelNode->IsFinal()) { uint32 id = FindAliasElem(*nextLevelNode)->GetClassID(); - (void)rootIDOfNADSs.insert(unionFind.Root(id)); + (void)rootIDOfNADSs.insert(unionFindAliasSet.Root(id)); } } } @@ -931,10 +991,10 @@ void AliasClass::UnionForNotAllDefsSeen() { unsigned int elemIdA = *(rootIDOfNADSs.begin()); rootIDOfNADSs.erase(rootIDOfNADSs.begin()); for (size_t elemIdB : rootIDOfNADSs) { - unionFind.Union(elemIdA, elemIdB); + unionFindAliasSet.Union(elemIdA, elemIdB); } for (auto *aliasElem : id2Elem) { - if (unionFind.Root(aliasElem->GetClassID()) == unionFind.Root(elemIdA)) { + if (unionFindAliasSet.Root(aliasElem->GetClassID()) == unionFindAliasSet.Root(elemIdA)) { aliasElem->SetNotAllDefsSeen(true); } } @@ -958,12 +1018,12 @@ void AliasClass::UnionForNotAllDefsSeenCLang() { AliasElem *notAllDefsSeenAe = notAllDefsSeenAes[0]; (void)notAllDefsSeenAes.erase(notAllDefsSeenAes.begin()); for (AliasElem *ae : notAllDefsSeenAes) { - unionFind.Union(notAllDefsSeenAe->GetClassID(), ae->GetClassID()); + unionFindAliasSet.Union(notAllDefsSeenAe->GetClassID(), ae->GetClassID()); } - uint rootIdOfNotAllDefsSeenAe = unionFind.Root(notAllDefsSeenAe->GetClassID()); + uint rootIdOfNotAllDefsSeenAe = unionFindAliasSet.Root(notAllDefsSeenAe->GetClassID()); for (AliasElem *ae : id2Elem) { - if (unionFind.Root(ae->GetClassID()) == rootIdOfNotAllDefsSeenAe) { + if (unionFindAliasSet.Root(ae->GetClassID()) == rootIdOfNotAllDefsSeenAe) { ae->SetNotAllDefsSeen(true); } } @@ -999,7 +1059,7 @@ void AliasClass::UnionForNotAllDefsSeenCLang() { AliasElem *nextLevAE = osym2Elem[nextLevelNode->GetIndex()]; if (nextLevAE != nullptr) { nextLevAE->SetNotAllDefsSeen(true); - unionFind.Union(notAllDefsSeenAe->GetClassID(), nextLevAE->GetClassID()); + unionFindAliasSet.Union(notAllDefsSeenAe->GetClassID(), nextLevAE->GetClassID()); } } } @@ -1025,7 +1085,7 @@ void AliasClass::UnionForAggAndFields() { if (id2Elem[idA]->GetOriginalSt().GetFieldID() == 0 && aesWithSameSymbol.size() > 1) { (void)aesWithSameSymbol.erase(idA); for (auto idB : aesWithSameSymbol) { - unionFind.Union(idA, idB); + unionFindAliasSet.Union(idA, idB); } break; } @@ -1049,7 +1109,8 @@ AliasElem *AliasClass::FindOrCreateDummyNADSAe() { dummyAe->SetNotAllDefsSeen(true); id2Elem.push_back(dummyAe); osym2Elem.push_back(dummyAe); - unionFind.NewMember(); + unionFindAssignSet.NewMember(); + unionFindAliasSet.NewMember(); return dummyAe; } } @@ -1066,7 +1127,7 @@ void AliasClass::UnionAllNodes(MapleVector *nextLevOsts) { for (; it != nextLevOsts->end(); ++it) { OriginalSt *ostB = *it; AliasElem *aeB = FindAliasElem(*ostB); - unionFind.Union(aeA->GetClassID(), aeB->GetClassID()); + unionFindAliasSet.Union(aeA->GetClassID(), aeB->GetClassID()); } } @@ -1108,7 +1169,7 @@ void AliasClass::CollectAliasGroups(std::mapGetClassID(); - unsigned int rootID = unionFind.Root(id); + unsigned int rootID = unionFindAliasSet.Root(id); if (id == rootID) { continue; } @@ -1198,7 +1259,7 @@ void AliasClass::ProcessIdsAliasWithRoot(const std::set &idsAliasW OriginalSt &ostB = id2Elem[idB]->GetOriginalSt(); if (AliasAccordingToType(ostA.GetPrevLevelOst()->GetTyIdx(), ostB.GetPrevLevelOst()->GetTyIdx()) && AliasAccordingToFieldID(ostA, ostB)) { - unionFind.Union(idA, idB); + unionFindAliasSet.Union(idA, idB); unioned = true; break; } @@ -1213,7 +1274,7 @@ void AliasClass::ReconstructAliasGroups() { // map the root id to the set contains the aliasElem-id that alias with the root. std::map> aliasGroups; CollectAliasGroups(aliasGroups); - unionFind.Reinit(); + unionFindAliasSet.Reinit(); // kv.first is the root id. kv.second is the id the alias with the root. for (auto oneGroup : aliasGroups) { std::vector newGroups; // contains one id of each new alias group. @@ -1226,7 +1287,7 @@ void AliasClass::ReconstructAliasGroups() { void AliasClass::CollectNotAllDefsSeenAes() { for (AliasElem *aliasElem : id2Elem) { - if (aliasElem->IsNotAllDefsSeen() && aliasElem->GetClassID() == unionFind.Root(aliasElem->GetClassID())) { + if (aliasElem->IsNotAllDefsSeen() && aliasElem->GetClassID() == unionFindAliasSet.Root(aliasElem->GetClassID())) { notAllDefsSeenClassSetRoots.push_back(aliasElem); } } @@ -1236,7 +1297,7 @@ void AliasClass::UnionNextLevelOfAliasOst() { std::map> rootId2AliasedOsts; for (AliasElem *aliasElem : id2Elem) { uint32 id = aliasElem->GetClassID(); - uint32 rootID = unionFind.Root(id); + uint32 rootID = unionFindAliasSet.Root(id); if (id != rootID) { auto &ost = aliasElem->GetOriginalSt(); auto &nextLevelOsts = ost.GetNextLevelOsts(); @@ -1266,7 +1327,7 @@ void AliasClass::UnionNextLevelOfAliasOst() { } AliasElem *indaeA = FindAliasElem(*ostA); AliasElem *indaeB = FindAliasElem(*ostB); - unionFind.Union(indaeA->GetClassID(), indaeB->GetClassID()); + unionFindAliasSet.Union(indaeA->GetClassID(), indaeB->GetClassID()); } } } @@ -1276,8 +1337,8 @@ void AliasClass::CreateClassSets() { // iterate through all the alias elems for (AliasElem *aliasElem : id2Elem) { unsigned int id = aliasElem->GetClassID(); - unsigned int rootID = unionFind.Root(id); - if (unionFind.GetElementsNumber(rootID) > 1) { + unsigned int rootID = unionFindAliasSet.Root(id); + if (unionFindAliasSet.GetElementsNumber(rootID) > 1) { if (id2Elem[rootID]->GetClassSet() == nullptr) { id2Elem[rootID]->classSet = acMemPool.New>(acAlloc.Adapter()); } @@ -1289,8 +1350,8 @@ void AliasClass::CreateClassSets() { #if DEBUG for (AliasElem *aliasElem : id2Elem) { if (aliasElem->GetClassSet() != nullptr && aliasElem->IsNotAllDefsSeen() == false && - unionFind.Root(aliasElem->GetClassID()) == aliasElem->GetClassID()) { - ASSERT(aliasElem->GetClassSet()->size() == unionFind.GetElementsNumber(aliasElem->GetClassID()), + unionFindAliasSet.Root(aliasElem->GetClassID()) == aliasElem->GetClassID()) { + ASSERT(aliasElem->GetClassSet()->size() == unionFindAliasSet.GetElementsNumber(aliasElem->GetClassID()), "AliasClass::CreateClassSets: wrong result"); } } @@ -1305,7 +1366,7 @@ void AliasElem::Dump() const { void AliasClass::DumpClassSets() { LogInfo::MapleLogger() << "/////// class sets ///////\n"; for (AliasElem *aliaselem : id2Elem) { - if (unionFind.Root(aliaselem->GetClassID()) != aliaselem->GetClassID()) { + if (unionFindAliasSet.Root(aliaselem->GetClassID()) != aliaselem->GetClassID()) { continue; } diff --git a/src/mapleall/maple_me/src/me_alias_class.cpp b/src/mapleall/maple_me/src/me_alias_class.cpp index 029457899a..4a28831fcd 100644 --- a/src/mapleall/maple_me/src/me_alias_class.cpp +++ b/src/mapleall/maple_me/src/me_alias_class.cpp @@ -52,7 +52,6 @@ void MeAliasClass::DoAliasAnalysis() { if (enabledDebug) { DumpAssignSets(); } - ReinitUnionFind(); if (MeOption::noSteensgaard) { UnionAllPointedTos(); } else { @@ -67,7 +66,6 @@ void MeAliasClass::DoAliasAnalysis() { if (!MeOption::noTBAA && mirModule.IsJavaModule()) { ReconstructAliasGroups(); } - UnionNextLevelOfAliasOst(); CreateClassSets(); if (enabledDebug) { DumpClassSets(); -- Gitee From 17fa07839e1462b9020dd3cc9bf98fdf4e5b65da Mon Sep 17 00:00:00 2001 From: "@evian_hill" Date: Sat, 17 Jul 2021 11:48:01 +0800 Subject: [PATCH 2/2] union next-level-osts of aliased-osts --- src/mapleall/maple_me/include/alias_class.h | 10 +- src/mapleall/maple_me/src/alias_class.cpp | 228 +++++++++++++++---- src/mapleall/maple_me/src/me_alias_class.cpp | 2 - 3 files changed, 191 insertions(+), 49 deletions(-) diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 9486b5d3f5..963e2e1a81 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -108,7 +108,8 @@ class AliasClass : public AnalysisResult { acMemPool(memPool), acAlloc(&memPool), ssaTab(ssaTabParam), - unionFind(memPool), + unionFindAssignSet(memPool), + unionFindAliasSet(memPool), osym2Elem(ssaTabParam.GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), id2Elem(acAlloc.Adapter()), notAllDefsSeenClassSetRoots(acAlloc.Adapter()), @@ -144,7 +145,8 @@ class AliasClass : public AnalysisResult { } void ReinitUnionFind() { - unionFind.Reinit(); + unionFindAssignSet.Reinit(); + unionFindAliasSet.Reinit(); } void ApplyUnionForCopies(StmtNode &stmt); @@ -196,6 +198,7 @@ class AliasClass : public AnalysisResult { void ApplyUnionForDassignCopy(AliasElem &lhsAe, AliasElem *rhsAe, BaseNode &rhs); bool SetNextLevNADSForEscapePtr(AliasElem &lhsAe, BaseNode &rhs); void CreateMirroringAliasElems(const OriginalSt *ost1, OriginalSt *ost2); + void UnionNextLevelOfAliasOst(std::set &aesToUnionNextLev); AliasElem *FindOrCreateDummyNADSAe(); AliasElem &FindOrCreateAliasElemOfAddrofOSt(OriginalSt &oSt); void CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts); @@ -233,7 +236,8 @@ class AliasClass : public AnalysisResult { MemPool &acMemPool; MapleAllocator acAlloc; SSATab &ssaTab; - UnionFind unionFind; + UnionFind unionFindAssignSet; + UnionFind unionFindAliasSet; MapleVector osym2Elem; // index is OStIdx MapleVector id2Elem; // index is the id MapleVector notAllDefsSeenClassSetRoots; // root of the not_all_defs_seen class sets diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 17715670c7..f01be82542 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -171,7 +171,8 @@ AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt &ost) { } id2Elem.push_back(aliasElem); osym2Elem[ostIdx] = aliasElem; - unionFind.NewMember(); + unionFindAssignSet.NewMember(); + unionFindAliasSet.NewMember(); return aliasElem; } @@ -338,7 +339,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { auto *opnd = expr.Opnd(1); if (!opnd->IsConstval() || !IsAddress(expr.GetPrimType())) { - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, OffsetType::InvalidOffset()); + return AliasInfo(aliasInfo.ae, 0, OffsetType::InvalidOffset()); } auto mirConst = static_cast(opnd)->GetConstVal(); CHECK_FATAL(mirConst->GetKind() == kConstInt, "array index must be integer"); @@ -350,7 +351,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { } constexpr int64 bitsPerByte = 8; OffsetType newOffset = aliasInfo.offset + constVal * bitsPerByte; - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, newOffset); + return AliasInfo(aliasInfo.ae, 0, newOffset); } case OP_array: { for (size_t i = 1; i < expr.NumOpnds(); ++i) { @@ -458,7 +459,7 @@ void AliasClass::ApplyUnionForFieldsInAggCopy(const OriginalSt *lhsost, const Or } AliasElem *aeOfLHSField = FindOrCreateAliasElem(*lhsFieldOst); AliasElem *aeOfRHSField = FindOrCreateAliasElem(*rhsFieldOst); - unionFind.Union(aeOfLHSField->id, aeOfRHSField->id); + unionFindAssignSet.Union(aeOfLHSField->id, aeOfRHSField->id); } } else if (lhsost->GetIndirectLev() == 0) { // make any field in this struct that has appeared NADS @@ -551,7 +552,12 @@ void AliasClass::ApplyUnionForDassignCopy(AliasElem &lhsAe, AliasElem *rhsAe, Ba if (SetNextLevNADSForEscapePtr(lhsAe, rhs)) { return; } - if (rhsAe == nullptr || rhsAe->GetOriginalSt().GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { + if (rhsAe == nullptr) { + lhsAe.SetNextLevNotAllDefsSeen(true); + return; + } + if (rhsAe->GetOriginalSt().GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { + unionFindAssignSet.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); lhsAe.SetNextLevNotAllDefsSeen(true); return; } @@ -570,7 +576,7 @@ void AliasClass::ApplyUnionForDassignCopy(AliasElem &lhsAe, AliasElem *rhsAe, Ba (rhs.GetOpCode() == OP_addrof && IsReadOnlyOst(rhsAe->GetOriginalSt()))) { return; } - unionFind.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); + unionFindAssignSet.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); } void AliasClass::SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *aliasElem, bool hasNoPrivateDefEffect) { @@ -612,7 +618,7 @@ void AliasClass::CreateMirroringAliasElems(const OriginalSt *ost1, OriginalSt *o ssaTab.GetVersionStTable().CreateZeroVersionSt(nextLevelOst2); } AliasElem *ae2 = FindOrCreateAliasElem(*nextLevelOst2); - unionFind.Union(ae1->GetClassID(), ae2->GetClassID()); + unionFindAssignSet.Union(ae1->GetClassID(), ae2->GetClassID()); CreateMirroringAliasElems(nextLevelOst1, nextLevelOst2); // recursive call } } @@ -633,13 +639,6 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { AliasElem *lhsAe = FindOrCreateAliasElem(*ost); ASSERT_NOT_NULL(lhsAe); ApplyUnionForDassignCopy(*lhsAe, rhsAinfo.ae, *stmt.Opnd(0)); - // at p = x, if the next level of either side exists, create other - // side's next level - if (mirModule.IsCModule() && rhsAinfo.ae && - (lhsAe->GetOriginalSt().GetTyIdx() == rhsAinfo.ae->GetOriginalSt().GetTyIdx())) { - CreateMirroringAliasElems(&rhsAinfo.ae->GetOriginalSt(), &lhsAe->GetOriginalSt()); - CreateMirroringAliasElems(&lhsAe->GetOriginalSt(), &rhsAinfo.ae->GetOriginalSt()); - } return; } case OP_iassign: { @@ -749,7 +748,7 @@ void AliasClass::UnionAddrofOstOfUnionFields() { StIdx stIdx = ost.GetMIRSymbol()->GetStIdx(); auto it = sym2AddrofOstAE.find(stIdx); if (it != sym2AddrofOstAE.end()) { - unionFind.Union(it->second->id, aliasElem->id); + unionFindAssignSet.Union(it->second->id, aliasElem->id); } else { sym2AddrofOstAE[stIdx] = aliasElem; } @@ -760,8 +759,8 @@ void AliasClass::CreateAssignSets() { // iterate through all the alias elems for (auto *aliasElem : id2Elem) { unsigned int id = aliasElem->GetClassID(); - unsigned int rootID = unionFind.Root(id); - if (unionFind.GetElementsNumber(rootID) > 1) { + unsigned int rootID = unionFindAssignSet.Root(id); + if (unionFindAssignSet.GetElementsNumber(rootID) > 1) { // only root id's have assignset if (id2Elem[rootID]->GetAssignSet() == nullptr) { id2Elem[rootID]->assignSet = acMemPool.New>(acAlloc.Adapter()); @@ -774,7 +773,7 @@ void AliasClass::CreateAssignSets() { void AliasClass::DumpAssignSets() { LogInfo::MapleLogger() << "/////// assign sets ///////\n"; for (auto *aliasElem : id2Elem) { - if (unionFind.Root(aliasElem->GetClassID()) != aliasElem->GetClassID()) { + if (unionFindAssignSet.Root(aliasElem->GetClassID()) != aliasElem->GetClassID()) { continue; } @@ -802,9 +801,72 @@ void AliasClass::UnionAllPointedTos() { } } for (size_t i = 1; i < pointedTos.size(); ++i) { - unionFind.Union(pointedTos[0]->GetClassID(), pointedTos[i]->GetClassID()); + unionFindAliasSet.Union(pointedTos[0]->GetClassID(), pointedTos[i]->GetClassID()); } } + +void AliasClass::UnionNextLevelOfAliasOst(std::set &aesToUnionNextLev) { + while (!aesToUnionNextLev.empty()) { + auto tmpSet = aesToUnionNextLev; + aesToUnionNextLev.clear(); + for (auto *aliasElem : tmpSet) { + auto aeId = aliasElem->GetClassID(); + if (unionFindAliasSet.Root(aeId) != aeId) { + continue; + } + + std::set mayAliasOsts; + for (uint32 id = 0; id < id2Elem.size(); ++id) { + if (unionFindAliasSet.Root(id) != aeId) { + continue; + } + auto *ost = id2Elem[id]->GetOst(); + auto &nextLevOsts = ost->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + + auto rootIdInAssignSet = unionFindAssignSet.Root(id); + auto *assignSet = id2Elem[rootIdInAssignSet]->GetAssignSet(); + if (assignSet == nullptr) { + continue; + } + for (auto valAliasId : *assignSet) { + if (valAliasId == id) { + continue; + } + auto &nextLevOsts = id2Elem[valAliasId]->GetOst()->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + } + } + + if (mayAliasOsts.empty()) { + continue; + } + + for (auto itA = mayAliasOsts.begin(); itA != mayAliasOsts.end(); ++itA) { + auto *ostA = *itA; + if (ostA->IsFinal()) { + continue; + } + auto itB = itA; + ++itB; + for (; itB != mayAliasOsts.end(); ++itB) { + auto *ostB = *itB; + if (ostB->IsFinal()) { + continue; + } + + auto idA = FindAliasElem(*ostA)->GetClassID(); + auto idB = FindAliasElem(*ostB)->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet.Root(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } + } + } + } + } +} + // process the union among the pointed's of assignsets void AliasClass::ApplyUnionForPointedTos() { // first, process nextLevNotAllDefsSeen for alias elems until no change @@ -825,7 +887,7 @@ void AliasClass::ApplyUnionForPointedTos() { } } } - }; + } // only for c language // base ptr may add/sub an offset to point to any field if (mirModule.IsCModule()) { @@ -872,6 +934,7 @@ void AliasClass::ApplyUnionForPointedTos() { } // apply union among the assignSet elements + std::set aesToUnionNextLev; tempset = *(aliaselem->GetAssignSet()); while (tempset.size() > 1) { // At least two elements in the same assignSet so that we can connect their next level // pick one alias element @@ -888,9 +951,73 @@ void AliasClass::ApplyUnionForPointedTos() { if (!MayAliasBasicAA(*ost1it, *ost2it)) { continue; } - AliasElem *indae1 = FindAliasElem(**ost1it); - AliasElem *indae2 = FindAliasElem(**ost2it); - unionFind.Union(indae1->GetClassID(), indae2->GetClassID()); + uint32 idA = FindAliasElem(**ost1it)->GetClassID(); + uint32 idB = FindAliasElem(**ost2it)->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet.Root(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } + } + } + } + } + + // union next-level-osts of aliased osts + while (!aesToUnionNextLev.empty()) { + auto tmpSet = aesToUnionNextLev; + aesToUnionNextLev.clear(); + for (auto *aliasElem : tmpSet) { + auto aeId = aliasElem->GetClassID(); + if (unionFindAliasSet.Root(aeId) != aeId) { + continue; + } + + std::set mayAliasOsts; + for (uint32 id = 0; id < id2Elem.size(); ++id) { + if (unionFindAliasSet.Root(id) != aeId) { + continue; + } + auto *ost = id2Elem[id]->GetOst(); + auto &nextLevOsts = ost->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + + auto rootIdInAssignSet = unionFindAssignSet.Root(id); + auto *assignSet = id2Elem[rootIdInAssignSet]->GetAssignSet(); + if (assignSet == nullptr) { + continue; + } + for (auto valAliasId : *assignSet) { + if (valAliasId == id) { + continue; + } + auto &nextLevOsts = id2Elem[valAliasId]->GetOst()->GetNextLevelOsts(); + (void)mayAliasOsts.insert(nextLevOsts.begin(), nextLevOsts.end()); + } + } + + if (mayAliasOsts.empty()) { + continue; + } + + for (auto itA = mayAliasOsts.begin(); itA != mayAliasOsts.end(); ++itA) { + auto *ostA = *itA; + if (ostA->IsFinal()) { + continue; + } + auto itB = itA; + ++itB; + for (; itB != mayAliasOsts.end(); ++itB) { + auto *ostB = *itB; + if (ostB->IsFinal()) { + continue; + } + + auto idA = FindAliasElem(*ostA)->GetClassID(); + auto idB = FindAliasElem(*ostB)->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet.Root(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } } } } @@ -903,7 +1030,7 @@ void AliasClass::CollectRootIDOfNextLevelNodes(const OriginalSt &ost, for (OriginalSt *nextLevelNode : ost.GetNextLevelOsts()) { if (!nextLevelNode->IsFinal()) { uint32 id = FindAliasElem(*nextLevelNode)->GetClassID(); - (void)rootIDOfNADSs.insert(unionFind.Root(id)); + (void)rootIDOfNADSs.insert(unionFindAliasSet.Root(id)); } } } @@ -930,11 +1057,16 @@ void AliasClass::UnionForNotAllDefsSeen() { if (!rootIDOfNADSs.empty()) { unsigned int elemIdA = *(rootIDOfNADSs.begin()); rootIDOfNADSs.erase(rootIDOfNADSs.begin()); + std::set aesToUnionNextLev; for (size_t elemIdB : rootIDOfNADSs) { - unionFind.Union(elemIdA, elemIdB); + if (unionFindAliasSet.Root(elemIdA) != unionFindAliasSet.Root(elemIdB)) { + unionFindAliasSet.Union(elemIdA, elemIdB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(elemIdA)]); + } } + UnionNextLevelOfAliasOst(aesToUnionNextLev); for (auto *aliasElem : id2Elem) { - if (unionFind.Root(aliasElem->GetClassID()) == unionFind.Root(elemIdA)) { + if (unionFindAliasSet.Root(aliasElem->GetClassID()) == unionFindAliasSet.Root(elemIdA)) { aliasElem->SetNotAllDefsSeen(true); } } @@ -957,13 +1089,20 @@ void AliasClass::UnionForNotAllDefsSeenCLang() { // Union notAllDefsSeenAe with the other notAllDefsSeen aes. AliasElem *notAllDefsSeenAe = notAllDefsSeenAes[0]; (void)notAllDefsSeenAes.erase(notAllDefsSeenAes.begin()); + std::set aesToUnionNextLev; for (AliasElem *ae : notAllDefsSeenAes) { - unionFind.Union(notAllDefsSeenAe->GetClassID(), ae->GetClassID()); + auto idA = notAllDefsSeenAe->GetClassID(); + auto idB = ae->GetClassID(); + if (unionFindAliasSet.Root(idA) != unionFindAliasSet.Root(idB)) { + unionFindAliasSet.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFindAliasSet.Root(idA)]); + } } + UnionNextLevelOfAliasOst(aesToUnionNextLev); - uint rootIdOfNotAllDefsSeenAe = unionFind.Root(notAllDefsSeenAe->GetClassID()); + uint rootIdOfNotAllDefsSeenAe = unionFindAliasSet.Root(notAllDefsSeenAe->GetClassID()); for (AliasElem *ae : id2Elem) { - if (unionFind.Root(ae->GetClassID()) == rootIdOfNotAllDefsSeenAe) { + if (unionFindAliasSet.Root(ae->GetClassID()) == rootIdOfNotAllDefsSeenAe) { ae->SetNotAllDefsSeen(true); } } @@ -999,7 +1138,7 @@ void AliasClass::UnionForNotAllDefsSeenCLang() { AliasElem *nextLevAE = osym2Elem[nextLevelNode->GetIndex()]; if (nextLevAE != nullptr) { nextLevAE->SetNotAllDefsSeen(true); - unionFind.Union(notAllDefsSeenAe->GetClassID(), nextLevAE->GetClassID()); + unionFindAliasSet.Union(notAllDefsSeenAe->GetClassID(), nextLevAE->GetClassID()); } } } @@ -1025,7 +1164,7 @@ void AliasClass::UnionForAggAndFields() { if (id2Elem[idA]->GetOriginalSt().GetFieldID() == 0 && aesWithSameSymbol.size() > 1) { (void)aesWithSameSymbol.erase(idA); for (auto idB : aesWithSameSymbol) { - unionFind.Union(idA, idB); + unionFindAliasSet.Union(idA, idB); } break; } @@ -1049,7 +1188,8 @@ AliasElem *AliasClass::FindOrCreateDummyNADSAe() { dummyAe->SetNotAllDefsSeen(true); id2Elem.push_back(dummyAe); osym2Elem.push_back(dummyAe); - unionFind.NewMember(); + unionFindAssignSet.NewMember(); + unionFindAliasSet.NewMember(); return dummyAe; } } @@ -1066,7 +1206,7 @@ void AliasClass::UnionAllNodes(MapleVector *nextLevOsts) { for (; it != nextLevOsts->end(); ++it) { OriginalSt *ostB = *it; AliasElem *aeB = FindAliasElem(*ostB); - unionFind.Union(aeA->GetClassID(), aeB->GetClassID()); + unionFindAliasSet.Union(aeA->GetClassID(), aeB->GetClassID()); } } @@ -1108,7 +1248,7 @@ void AliasClass::CollectAliasGroups(std::mapGetClassID(); - unsigned int rootID = unionFind.Root(id); + unsigned int rootID = unionFindAliasSet.Root(id); if (id == rootID) { continue; } @@ -1198,7 +1338,7 @@ void AliasClass::ProcessIdsAliasWithRoot(const std::set &idsAliasW OriginalSt &ostB = id2Elem[idB]->GetOriginalSt(); if (AliasAccordingToType(ostA.GetPrevLevelOst()->GetTyIdx(), ostB.GetPrevLevelOst()->GetTyIdx()) && AliasAccordingToFieldID(ostA, ostB)) { - unionFind.Union(idA, idB); + unionFindAliasSet.Union(idA, idB); unioned = true; break; } @@ -1213,7 +1353,7 @@ void AliasClass::ReconstructAliasGroups() { // map the root id to the set contains the aliasElem-id that alias with the root. std::map> aliasGroups; CollectAliasGroups(aliasGroups); - unionFind.Reinit(); + unionFindAliasSet.Reinit(); // kv.first is the root id. kv.second is the id the alias with the root. for (auto oneGroup : aliasGroups) { std::vector newGroups; // contains one id of each new alias group. @@ -1226,7 +1366,7 @@ void AliasClass::ReconstructAliasGroups() { void AliasClass::CollectNotAllDefsSeenAes() { for (AliasElem *aliasElem : id2Elem) { - if (aliasElem->IsNotAllDefsSeen() && aliasElem->GetClassID() == unionFind.Root(aliasElem->GetClassID())) { + if (aliasElem->IsNotAllDefsSeen() && aliasElem->GetClassID() == unionFindAliasSet.Root(aliasElem->GetClassID())) { notAllDefsSeenClassSetRoots.push_back(aliasElem); } } @@ -1236,7 +1376,7 @@ void AliasClass::UnionNextLevelOfAliasOst() { std::map> rootId2AliasedOsts; for (AliasElem *aliasElem : id2Elem) { uint32 id = aliasElem->GetClassID(); - uint32 rootID = unionFind.Root(id); + uint32 rootID = unionFindAliasSet.Root(id); if (id != rootID) { auto &ost = aliasElem->GetOriginalSt(); auto &nextLevelOsts = ost.GetNextLevelOsts(); @@ -1266,7 +1406,7 @@ void AliasClass::UnionNextLevelOfAliasOst() { } AliasElem *indaeA = FindAliasElem(*ostA); AliasElem *indaeB = FindAliasElem(*ostB); - unionFind.Union(indaeA->GetClassID(), indaeB->GetClassID()); + unionFindAliasSet.Union(indaeA->GetClassID(), indaeB->GetClassID()); } } } @@ -1276,8 +1416,8 @@ void AliasClass::CreateClassSets() { // iterate through all the alias elems for (AliasElem *aliasElem : id2Elem) { unsigned int id = aliasElem->GetClassID(); - unsigned int rootID = unionFind.Root(id); - if (unionFind.GetElementsNumber(rootID) > 1) { + unsigned int rootID = unionFindAliasSet.Root(id); + if (unionFindAliasSet.GetElementsNumber(rootID) > 1) { if (id2Elem[rootID]->GetClassSet() == nullptr) { id2Elem[rootID]->classSet = acMemPool.New>(acAlloc.Adapter()); } @@ -1289,8 +1429,8 @@ void AliasClass::CreateClassSets() { #if DEBUG for (AliasElem *aliasElem : id2Elem) { if (aliasElem->GetClassSet() != nullptr && aliasElem->IsNotAllDefsSeen() == false && - unionFind.Root(aliasElem->GetClassID()) == aliasElem->GetClassID()) { - ASSERT(aliasElem->GetClassSet()->size() == unionFind.GetElementsNumber(aliasElem->GetClassID()), + unionFindAliasSet.Root(aliasElem->GetClassID()) == aliasElem->GetClassID()) { + ASSERT(aliasElem->GetClassSet()->size() == unionFindAliasSet.GetElementsNumber(aliasElem->GetClassID()), "AliasClass::CreateClassSets: wrong result"); } } @@ -1305,7 +1445,7 @@ void AliasElem::Dump() const { void AliasClass::DumpClassSets() { LogInfo::MapleLogger() << "/////// class sets ///////\n"; for (AliasElem *aliaselem : id2Elem) { - if (unionFind.Root(aliaselem->GetClassID()) != aliaselem->GetClassID()) { + if (unionFindAliasSet.Root(aliaselem->GetClassID()) != aliaselem->GetClassID()) { continue; } diff --git a/src/mapleall/maple_me/src/me_alias_class.cpp b/src/mapleall/maple_me/src/me_alias_class.cpp index 029457899a..4a28831fcd 100644 --- a/src/mapleall/maple_me/src/me_alias_class.cpp +++ b/src/mapleall/maple_me/src/me_alias_class.cpp @@ -52,7 +52,6 @@ void MeAliasClass::DoAliasAnalysis() { if (enabledDebug) { DumpAssignSets(); } - ReinitUnionFind(); if (MeOption::noSteensgaard) { UnionAllPointedTos(); } else { @@ -67,7 +66,6 @@ void MeAliasClass::DoAliasAnalysis() { if (!MeOption::noTBAA && mirModule.IsJavaModule()) { ReconstructAliasGroups(); } - UnionNextLevelOfAliasOst(); CreateClassSets(); if (enabledDebug) { DumpClassSets(); -- Gitee