From e34f80ad693b545658924be670a67bd23ea13de9 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 15 Apr 2021 01:10:45 -0700 Subject: [PATCH] Fixed hdse bug in which it did not propagate liveness along IvarMeExpr's mu --- src/mapleall/maple_ir/src/global_tables.cpp | 4 ++-- src/mapleall/maple_me/include/me_option.h | 1 + .../maple_me/src/alias_analysis_table.cpp | 4 ++-- src/mapleall/maple_me/src/hdse.cpp | 12 ++++++++++-- src/mapleall/maple_me/src/me_irmap_build.cpp | 2 +- src/mapleall/maple_me/src/me_option.cpp | 15 +++++++++++++++ 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/mapleall/maple_ir/src/global_tables.cpp b/src/mapleall/maple_ir/src/global_tables.cpp index 4de8a15012..879db1ad52 100644 --- a/src/mapleall/maple_ir/src/global_tables.cpp +++ b/src/mapleall/maple_ir/src/global_tables.cpp @@ -82,7 +82,7 @@ MIRType *TypeTable::CreateAndUpdateMirTypeNode(MIRType &pType) { if (pType.IsMIRPtrType()) { auto &pty = static_cast(pType); if (pty.GetTypeAttrs() == TypeAttrs()) { - if (pty.GetPrimType() == PTY_ptr) { + if (pty.GetPrimType() != PTY_ref) { ptrTypeMap[pty.GetPointedTyIdx()] = nType->GetTypeIndex(); } else { refTypeMap[pty.GetPointedTyIdx()] = nType->GetTypeIndex(); @@ -100,7 +100,7 @@ MIRType* TypeTable::GetOrCreateMIRTypeNode(MIRType &pType) { if (pType.IsMIRPtrType()) { auto &type = static_cast(pType); if (type.GetTypeAttrs() == TypeAttrs()) { - auto *pMap = (type.GetPrimType() == PTY_ptr ? &ptrTypeMap : &refTypeMap); + auto *pMap = (type.GetPrimType() != PTY_ref ? &ptrTypeMap : &refTypeMap); auto *otherPMap = (type.GetPrimType() == PTY_ref ? &ptrTypeMap : &refTypeMap); { std::shared_lock lock(mtx); diff --git a/src/mapleall/maple_me/include/me_option.h b/src/mapleall/maple_me/include/me_option.h index 4e81274886..736c9792b0 100644 --- a/src/mapleall/maple_me/include/me_option.h +++ b/src/mapleall/maple_me/include/me_option.h @@ -112,6 +112,7 @@ class MeOption : public MapleDriverOptionBase { static bool propFinaliLoadRef; static bool propIloadRefNonParm; static bool propAtPhi; + static bool propDuringBuild; static bool lpreSpeculate; static bool spillAtCatch; static bool optDirectCall; diff --git a/src/mapleall/maple_me/src/alias_analysis_table.cpp b/src/mapleall/maple_me/src/alias_analysis_table.cpp index 30fb74fe9c..7bade2fed7 100644 --- a/src/mapleall/maple_me/src/alias_analysis_table.cpp +++ b/src/mapleall/maple_me/src/alias_analysis_table.cpp @@ -46,10 +46,10 @@ OriginalSt *AliasAnalysisTable::FindOrCreateAddrofSymbolOriginalSt(OriginalSt &o ost.GetPuIdx(), 0, originalStTab.GetAlloc()); originalStTab.GetOriginalStVector().push_back(prevLevelOst); prevLevelOst->SetIndirectLev(-1); - MIRPtrType pointType(ost.GetTyIdx(), PTY_ptr); + MIRPtrType pointType(ost.GetMIRSymbol()->GetTyIdx(), PTY_ptr); TyIdx newTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType); prevLevelOst->SetTyIdx(newTyIdx); - prevLevelOst->SetFieldID(ost.GetFieldID()); + prevLevelOst->SetFieldID(0); GetNextLevelNodes(*prevLevelOst)->push_back(&ost); (void)prevLevelNode.insert(std::make_pair(ost.GetIndex(), prevLevelOst)); return prevLevelOst; diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index 561ea7be24..a4b61a1bb2 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -433,8 +433,16 @@ void HDSE::MarkSingleUseLive(MeExpr &meExpr) { } case kMeOpIvar: { auto *base = static_cast(meExpr).GetBase(); - if (base != nullptr) { - MarkSingleUseLive(*base); + MarkSingleUseLive(*base); + VarMeExpr *mu = static_cast(meExpr).GetMu(); + if (mu->GetDefBy() != kDefByNo) { + MapleMap *chiList = GenericGetChiListFromVarMeExpr(*mu); + if (chiList != nullptr) { + MapleMap::iterator it = chiList->begin(); + for (; it != chiList->end(); it++) { + MarkChiNodeRequired(*it->second); + } + } } break; } diff --git a/src/mapleall/maple_me/src/me_irmap_build.cpp b/src/mapleall/maple_me/src/me_irmap_build.cpp index 29a2f29fa6..6e16faa4c6 100644 --- a/src/mapleall/maple_me/src/me_irmap_build.cpp +++ b/src/mapleall/maple_me/src/me_irmap_build.cpp @@ -35,7 +35,7 @@ AnalysisResult *MeDoIRMapBuild::Run(MeFunction *func, MeFuncResultMgr *funcResMg globalIRMap = irMap; #endif MemPool *propMp = nullptr; - if (!func->GetMIRModule().IsJavaModule()) { + if (!func->GetMIRModule().IsJavaModule() && MeOption::propDuringBuild) { // create propgation propMp = memPoolCtrler.NewMemPool("meirbuild prop"); MeProp meprop(*irMap, *dom, *propMp, Prop::PropConfig{false, false, false, false, false, false}); diff --git a/src/mapleall/maple_me/src/me_option.cpp b/src/mapleall/maple_me/src/me_option.cpp index 90b68394a8..2d2459e9f9 100644 --- a/src/mapleall/maple_me/src/me_option.cpp +++ b/src/mapleall/maple_me/src/me_option.cpp @@ -69,6 +69,7 @@ bool MeOption::spillAtCatch = false; bool MeOption::rcLowering = true; bool MeOption::optDirectCall = false; bool MeOption::propAtPhi = true; +bool MeOption::propDuringBuild = true; bool MeOption::dseKeepRef = false; bool MeOption::decoupleStatic = false; bool MeOption::dumpBefore = false; @@ -182,6 +183,7 @@ enum OptionIndex { kRegReadAtReturn, kProPatphi, kNoProPatphi, + kPropDuringBuild, kOptInterfaceCall, kNoOptInterfaceCall, kOptVirtualCall, @@ -815,6 +817,16 @@ const Descriptor kUsage[] = { " --no-propatphi \tDisable propatphi\n", "me", {} }, + { kPropDuringBuild, + kEnable, + "", + "propduringbuild", + kBuildTypeExperimental, + kArgCheckPolicyBool, + " --propduringbuild \tEnable copy propagation when building HSSA\n" + " --no-propduringbuild \tDisable propduringbuild\n", + "me", + {} }, { kMeNativeOpt, kEnable, "", @@ -1267,6 +1279,9 @@ bool MeOption::SolveOptions(const std::vector &opts, bool i case kProPatphi: propAtPhi = (opt.Type() == kEnable); break; + case kPropDuringBuild: + propDuringBuild = (opt.Type() == kEnable); + break; case kMeNativeOpt: nativeOpt = (opt.Type() == kEnable); break; -- Gitee