From 1282209d53056947509c018e102b18a022c189db Mon Sep 17 00:00:00 2001 From: "@evian_hill" Date: Thu, 29 Jul 2021 14:54:08 +0800 Subject: [PATCH] fix bug for issue I42IIY --- src/mapleall/maple_me/src/alias_class.cpp | 45 +++++++------------ src/mapleall/maple_me/src/cfg_opt.cpp | 3 ++ .../src/demand_driven_alias_analysis.cpp | 16 +++---- src/mapleall/maple_me/src/orig_symbol.cpp | 26 ++++++----- 4 files changed, 42 insertions(+), 48 deletions(-) diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index a26edf6ccf..1fdeca328b 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -220,28 +220,6 @@ OffsetType AliasClass::OffsetInBitOfArrayElement(const ArrayNode *arrayNode) { OriginalSt *AliasClass::FindOrCreateExtraLevOst(SSATab *ssaTab, OriginalSt *prevLevOst, const TyIdx &tyIdx, FieldID fld, OffsetType offset) { - if (!offset.IsInvalid() && prevLevOst->GetIndirectLev() < 0) { - auto mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx); - ASSERT(mirType->IsMIRPtrType(), "must be pointer type"); - auto typeOfOst = static_cast(mirType)->GetPointedType(); - if (fld != 0 && fld <= typeOfOst->NumberOfFieldIDs()) { - typeOfOst = static_cast(typeOfOst)->GetFieldType(fld); - } - const auto &ostPair = ssaTab->GetOriginalStTable().FindOrCreateSymbolOriginalSt(*prevLevOst->GetMIRSymbol(), - prevLevOst->GetPuIdx(), fld, typeOfOst->GetTypeIndex(), offset); - auto *newOst = ostPair.first; - newOst->SetPrevLevelOst(prevLevOst); - if (ostPair.second) { - prevLevOst->AddNextLevelOst(newOst, true); - } - return newOst; - } - - const TyIdx &tyIdxOfBaseOst = prevLevOst->GetTyIdx(); - if (ssaTab->GetModule().IsCModule() && tyIdxOfBaseOst != tyIdx) { - return ssaTab->GetOriginalStTable().FindOrCreateExtraLevOriginalSt(prevLevOst, tyIdx, 0, offset); - } - return ssaTab->GetOriginalStTable().FindOrCreateExtraLevOriginalSt(prevLevOst, tyIdx, fld, offset); } @@ -252,12 +230,12 @@ AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &baseAddress, cons if (aliasInfoOfBaseAddress.ae == nullptr) { return FindOrCreateDummyNADSAe(); } - if (mirModule.IsCModule() && IsNullOrDummySymbolOst(aliasInfoOfBaseAddress.ae->GetOst())) { + auto *baseOst = aliasInfoOfBaseAddress.ae->GetOst(); + if (mirModule.IsCModule() && IsNullOrDummySymbolOst(baseOst)) { return FindOrCreateDummyNADSAe(); } - auto newOst = FindOrCreateExtraLevOst(&ssaTab, aliasInfoOfBaseAddress.ae->GetOst(), tyIdx, - aliasInfoOfBaseAddress.fieldID + fieldId, + auto newOst = FindOrCreateExtraLevOst(&ssaTab, baseOst, tyIdx, fieldId, typeHasBeenCasted ? OffsetType(kOffsetUnknown) : aliasInfoOfBaseAddress.offset); CHECK_FATAL(newOst != nullptr, "null ptr check"); @@ -320,8 +298,11 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { auto &iread = static_cast(expr); MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(iread.GetTyIdx()); CHECK_FATAL(mirType->GetKind() == kTypePointer, "CreateAliasElemsExpr: ptr type expected in iread"); - bool typeHasBeenCasted = - static_cast(mirType)->GetPointedType()->GetSize() != GetPrimTypeSize(iread.GetPrimType()); + auto *pointedType = static_cast(mirType)->GetPointedType(); + if (iread.GetFieldID() > 0) { + pointedType = static_cast(pointedType)->GetFieldType(iread.GetFieldID()); + } + bool typeHasBeenCasted = pointedType->GetSize() != GetPrimTypeSize(iread.GetPrimType()); return AliasInfo(FindOrCreateExtraLevAliasElem( *iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID(), typeHasBeenCasted), 0, OffsetType(0)); } @@ -1203,11 +1184,19 @@ void AliasClass::UnionAllNodes(MapleVector *nextLevOsts) { OriginalSt *ostA = *it; AliasElem *aeA = FindAliasElem(*ostA); ++it; + std::set aesToUnionNextLev; for (; it != nextLevOsts->end(); ++it) { OriginalSt *ostB = *it; AliasElem *aeB = FindAliasElem(*ostB); - unionFind.Union(aeA->GetClassID(), aeB->GetClassID()); + auto idA = aeA->GetClassID(); + auto idB = aeB->GetClassID(); + if (unionFind.Root(idA) != unionFind.Root(idB)) { + unionFind.Union(idA, idB); + aesToUnionNextLev.insert(id2Elem[unionFind.Root(idA)]); + } } + // union next-level-osts of aliased osts + UnionNextLevelOfAliasOst(aesToUnionNextLev); } // This is applicable only for C language. For each ost that is a struct, diff --git a/src/mapleall/maple_me/src/cfg_opt.cpp b/src/mapleall/maple_me/src/cfg_opt.cpp index 48cf73ad7c..3233d96ccf 100644 --- a/src/mapleall/maple_me/src/cfg_opt.cpp +++ b/src/mapleall/maple_me/src/cfg_opt.cpp @@ -65,6 +65,9 @@ void CfgOpt::PropagateBB(BB &bb, BB *trueBranchBB, BB *falseBranchBB) { return; } for (auto predBB : bb.GetPred()) { + if (predBB->IsEmpty()) { + continue; + } BB *trueBranchBBForPred = trueBranchBB; BB *falseBranchBBForPred = falseBranchBB; switch (predBB->GetKind()) { diff --git a/src/mapleall/maple_me/src/demand_driven_alias_analysis.cpp b/src/mapleall/maple_me/src/demand_driven_alias_analysis.cpp index 1974af4cdc..dbb8729eb2 100644 --- a/src/mapleall/maple_me/src/demand_driven_alias_analysis.cpp +++ b/src/mapleall/maple_me/src/demand_driven_alias_analysis.cpp @@ -166,16 +166,16 @@ PEGBuilder::PtrValueRecorder PEGBuilder::BuildPEGNodeOfIread(const IreadSSANode } auto *ostOfBase = ptrNode.pegNode->ost; - FieldID fieldId = iread->GetFieldID() + ptrNode.fieldId; - MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(iread->GetTyIdx()); CHECK_FATAL(mirType->GetKind() == kTypePointer, "CreateAliasElemsExpr: ptr type expected in iread"); - bool typeHasBeenCasted = - static_cast(mirType)->GetPointedType()->GetSize() != GetPrimTypeSize(iread->GetPrimType()); + auto *pointedType = static_cast(mirType)->GetPointedType(); + if (iread->GetFieldID() > 0) { + pointedType = static_cast(pointedType)->GetFieldType(iread->GetFieldID()); + } + bool typeHasBeenCasted = pointedType->GetSize() != GetPrimTypeSize(iread->GetPrimType()); OffsetType offset = typeHasBeenCasted ? OffsetType::InvalidOffset() : ptrNode.offset; - auto *mayUsedOst = - AliasClass::FindOrCreateExtraLevOst(ssaTab, ostOfBase, iread->GetTyIdx(), fieldId, offset); + AliasClass::FindOrCreateExtraLevOst(ssaTab, ostOfBase, iread->GetTyIdx(), iread->GetFieldID(), offset); // build prevLev-nextLev relationship auto *pegNodeOfMayUsedOSt = peg->GetOrCreateNodeOf(mayUsedOst); @@ -493,10 +493,8 @@ void PEGBuilder::BuildPEGNodeInIassign(const IassignNode *iassign) { } auto *ostOfBase = baseAddrValNode.pegNode->ost; - FieldID fieldId = iassign->GetFieldID() + baseAddrValNode.fieldId; - OriginalSt *defedOst = AliasClass::FindOrCreateExtraLevOst( - ssaTab, ostOfBase, iassign->GetTyIdx(), fieldId, baseAddrValNode.offset); + ssaTab, ostOfBase, iassign->GetTyIdx(), iassign->GetFieldID(), baseAddrValNode.offset); PEGNode *lhsNode = peg->GetOrCreateNodeOf(defedOst); // build prevLev-nextLev relation diff --git a/src/mapleall/maple_me/src/orig_symbol.cpp b/src/mapleall/maple_me/src/orig_symbol.cpp index 3c97c5b032..ee6bab28ff 100644 --- a/src/mapleall/maple_me/src/orig_symbol.cpp +++ b/src/mapleall/maple_me/src/orig_symbol.cpp @@ -188,13 +188,6 @@ OriginalSt *OriginalStTable::FindOrCreateAddrofSymbolOriginalSt(OriginalSt *ost) OriginalSt *OriginalStTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt *ost, TyIdx tyIdx, FieldID fld, const OffsetType &offset, const KlassHierarchy *klassHierarchy) { - TyIdx ptyIdxOfOst = ost->GetTyIdx(); - FieldID fldIDInOst = fld; - if (ptyIdxOfOst != tyIdx && klassHierarchy != nullptr) { - (void)klassHierarchy->UpdateFieldID(tyIdx, ptyIdxOfOst, fldIDInOst); - } - - auto nextLevelOsts = ost->GetNextLevelOsts(); MIRType *typeOfExtraLevOst = GlobalTables::GetTypeTable().GetVoid(); OffsetType offsetOfNextLevOst(kOffsetUnknown); tyIdx = (tyIdx == 0u) ? ost->GetTyIdx() : tyIdx; @@ -215,7 +208,17 @@ OriginalSt *OriginalStTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt * } } - OriginalSt *nextLevOst = FindExtraLevOriginalSt(nextLevelOsts, typeOfExtraLevOst, fldIDInOst, offsetOfNextLevOst); + TyIdx ptyIdxOfOst = ost->GetTyIdx(); + FieldID fldIDInOst = fld; + if (ptyIdxOfOst != tyIdx) { + if (klassHierarchy != nullptr) { + (void)klassHierarchy->UpdateFieldID(tyIdx, ptyIdxOfOst, fldIDInOst); + } else { + fldIDInOst = 0; + } + } + OriginalSt *nextLevOst = + FindExtraLevOriginalSt(ost->GetNextLevelOsts(), typeOfExtraLevOst, fldIDInOst, offsetOfNextLevOst); if (nextLevOst != nullptr) { return nextLevOst; } @@ -264,9 +267,10 @@ OriginalSt *OriginalStTable::FindOrCreateExtraLevOriginalSt(OriginalSt *ost, TyI OriginalSt *OriginalStTable::FindExtraLevOriginalSt(const MapleVector &nextLevelOsts, MIRType *type, FieldID fld, const OffsetType &offset) { for (OriginalSt *nextLevelOst : nextLevelOsts) { - if (nextLevelOst->GetFieldID() == fld && nextLevelOst->GetOffset() == offset && - nextLevelOst->GetType()->GetSize() == type->GetSize()) { - return nextLevelOst; + if (nextLevelOst->GetOffset() == offset && nextLevelOst->GetType() == type) { + if (nextLevelOst->GetFieldID() == fld || fld == 0) { + return nextLevelOst; + } } } return nullptr; -- Gitee