From 37f99fb919687c4ec19173cb0c265689edaca894 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 13 Apr 2021 09:10:02 -0700 Subject: [PATCH] More mapleme fixes for problems found optimizing C torture tests --- src/mapleall/maple_me/include/orig_symbol.h | 10 ++++++++++ src/mapleall/maple_me/src/alias_class.cpp | 15 ++++++++++----- src/mapleall/maple_me/src/hdse.cpp | 9 +++++++++ src/mapleall/maple_me/src/irmap_build.cpp | 8 ++++++-- src/mapleall/maple_me/src/prop.cpp | 1 - 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/mapleall/maple_me/include/orig_symbol.h b/src/mapleall/maple_me/include/orig_symbol.h index e4670ba4b0..3c34b86a17 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 0e0896110a..8c042609a2 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 36efa6b951..561ea7be24 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 71af6a79fc..12e42f0187 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 d6e588de52..2b01e7de1a 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))); } } -- Gitee