diff --git a/src/mapleall/maple_me/include/orig_symbol.h b/src/mapleall/maple_me/include/orig_symbol.h index e4670ba4b05f794b42c9c176a37c00fd651cf12e..3c34b86a173b8063e322089215b385e608e9f48d 100644 --- a/src/mapleall/maple_me/include/orig_symbol.h +++ b/src/mapleall/maple_me/include/orig_symbol.h @@ -121,6 +121,16 @@ class OriginalSt { return ostType == kPregOst && symOrPreg.pregIdx < 0; } + bool IsSameSymOrPreg(OriginalSt *ost) const { + if (ostType != ost->ostType) { + return false; + } + if (IsSymbolOst()) { + return symOrPreg.mirSt == ost->symOrPreg.mirSt; + } + return symOrPreg.pregIdx == ost->symOrPreg.pregIdx; + } + int8 GetIndirectLev() const { return indirectLev; } diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 0e0896110abbe1d14afcb0baa9c4ac52e1f2558c..8c042609a2d0b2e810666fd8ded5125b46b85ca7 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -591,7 +591,7 @@ AliasElem *AliasClass::FindOrCreateDummyNADSAe() { ASSERT_NOT_NULL(dummySym); dummySym->SetIsTmp(true); dummySym->SetIsDeleted(); - OriginalSt *dummyOst = ssaTab.GetOriginalStTable().CreateSymbolOriginalSt(*dummySym, 0, 0); + OriginalSt *dummyOst = ssaTab.GetOriginalStTable().FindOrCreateSymbolOriginalSt(*dummySym, 0, 0); ssaTab.GetVersionStTable().CreateZeroVersionSt(dummyOst); if (osym2Elem.size() == dummyOst->GetIndex()) { AliasElem *dummyAe = acMemPool.New(osym2Elem.size(), *dummyOst); @@ -984,7 +984,7 @@ void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::setGetMIRSymbol() == ostOfLhsAe->GetMIRSymbol() && + if (ostOfAliasAe->IsSameSymOrPreg(ostOfLhsAe) && fldIDA != fldIDB && lhsSymType->GetKind() != kTypeUnion) { MIRType *aliasAeType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ostOfAliasAe->GetTyIdx()); @@ -1085,8 +1085,8 @@ void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set & if (ostOfAliasAE.GetTyIdx() != pointedTyIdx && pointedTyIdx != 0) { continue; } - } else if (ostOfAliasAE.IsSymbolOst()) { - if (ostOfAliasAE.GetMIRSymbol() == ostOfLhsAe->GetMIRSymbol() && + } else { + if (ostOfAliasAE.IsSameSymOrPreg(ostOfLhsAe) && ostOfAliasAE.GetFieldID() != ostOfLhsAe->GetFieldID() && ostOfAliasAE.GetFieldID() != 0 && ostOfLhsAe->GetFieldID() != 0) { MIRType *aliasAeType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ostOfAliasAE.GetTyIdx()); @@ -1202,7 +1202,12 @@ void AliasClass::CollectMayDefForMustDefs(const StmtNode &stmt, std::setGetClassSet())) { bool isNotAllDefsSeen = false; for (AliasElem *notAllDefsSeenAe : notAllDefsSeenClassSetRoots) { - if (notAllDefsSeenAe->GetClassSet()->find(elemID) != notAllDefsSeenAe->GetClassSet()->end()) { + if (notAllDefsSeenAe->GetClassSet() == nullptr) { + if (elemID == notAllDefsSeenAe->GetClassID()) { + isNotAllDefsSeen = true; + break; // inserted already + } + } else if (notAllDefsSeenAe->GetClassSet()->find(elemID) != notAllDefsSeenAe->GetClassSet()->end()) { isNotAllDefsSeen = true; break; // inserted already } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index 36efa6b951a24631a412fb07c4559f57e511aaa2..561ea7be24cb5cbcae4dbce5bc92deb14c8692f9 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -173,6 +173,15 @@ void HDSE::MarkRegDefByStmt(RegMeExpr ®MeExpr) { case kDefByPhi: MarkPhiRequired(regMeExpr.GetDefPhi()); break; + case kDefByChi: { + ASSERT(regMeExpr.GetOst()->GetIndirectLev() > 0, + "MarkRegDefByStmt: preg cannot be defined by chi"); + auto *defChi = ®MeExpr.GetDefChi(); + if (defChi != nullptr) { + MarkChiNodeRequired(*defChi); + } + break; + } case kDefByMustDef: { MustDefMeNode *mustDef = ®MeExpr.GetDefMustDef(); if (!mustDef->GetIsLive()) { diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index 71af6a79fc424ff1bfbfb535370bc59bf30fff12..12e42f01875e9c9e567f7939d5bdbaaec8fe2d43 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -91,8 +91,12 @@ void IRMapBuild::BuildMustDefList(MeStmt &meStmt, TypeOfMustDefList &mustDefList MapleVector &mustDefMeList) { for (auto &mustDefNode : mustDefList) { VersionSt *vst = mustDefNode.GetResult(); - VarMeExpr *lhs = GetOrCreateVarFromVerSt(*vst); - ASSERT(lhs->GetMeOp() == kMeOpReg || lhs->GetMeOp() == kMeOpVar, "unexpected opcode"); + ScalarMeExpr *lhs = nullptr; + if (vst->GetOst()->IsSymbolOst()) { + lhs = GetOrCreateVarFromVerSt(*vst); + } else { + lhs = GetOrCreateRegFromVerSt(*vst); + } mustDefMeList.emplace_back(MustDefMeNode(lhs, &meStmt)); } } diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index d6e588de52cd56ad2a27834c216cc88803e4bd1f..2b01e7de1a9481f3599e43742c144339255ef378 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -561,7 +561,6 @@ void Prop::TraversalMeStmt(MeStmt &meStmt) { MapleVector *mustDefList = meStmt.GetMustDefList(); for (auto &node : utils::ToRef(mustDefList)) { MeExpr *meLhs = node.GetLHS(); - CHECK_FATAL(meLhs->GetMeOp() == kMeOpVar, "error: lhs is not var"); PropUpdateDef(utils::ToRef(static_cast(meLhs))); } }