From 673be19c4fdf72924a1d1535b3b08728999e8d49 Mon Sep 17 00:00:00 2001 From: Alfred Huang Date: Sat, 20 Aug 2022 18:23:28 -0700 Subject: [PATCH 1/3] Complete regsave pass by getting rid of all workaround. --- .../src/cg/aarch64/aarch64_regsaves.cpp | 37 +------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp index 2b9e6f66cd..24f95a4aac 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp @@ -40,7 +40,7 @@ void AArch64RegSavesOpt::CreateReachingBBs(ReachInfo &rp, const BB &bb) { } } #if RS_DUMP - M_LOG << " --ReachingBBs for BB " << bb->GetId() << " created\n"; + M_LOG << " --ReachingBBs for BB " << bb.GetId() << " created\n"; #endif } @@ -195,19 +195,6 @@ static bool IsBackEdge(BB* bb, BB* targ) { return false; } -static bool BBHasTerminalCall(BB &bb) { - if (bb.GetKind() == BB::kBBGoto && bb.NumInsn() > 1) { - Insn *insn = bb.GetLastInsn()->GetPrev(); - if (insn->GetMachineOpcode() == MOP_xbl) { - auto *nameOpnd = static_cast(&insn->GetOperand(kInsnFirstOpnd)); - if (nameOpnd->GetName() == "fancy_abort") { - return true; - } - } - } - return false; -} - void AArch64RegSavesOpt::GenAccDefs() { /* Set up accumulated callee def bits in all blocks */ for (auto bb : bfs->sortedBBs) { @@ -221,9 +208,6 @@ void AArch64RegSavesOpt::GenAccDefs() { if (IsBackEdge(bb, pred)) { continue; } - if (BBHasTerminalCall(*pred)) { - continue; - } tmp &= GetBBCalleeBits(GetCalleeBitsAcc(), pred->GetId()); } SetCalleeBit(GetCalleeBitsAcc(), bb->GetId(), curbbBits | tmp); @@ -654,25 +638,6 @@ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { /* something gone wrong, skip this reg */ wkCand.restoreAtEpilog = true; } - /* splitted empty block for critical edge present, skip reg */ - MapleSet rset = wkCand.restoreAtEntryBBs; - for (auto bbid : wkCand.restoreAtExitBBs) { - (void)rset.insert(bbid); - } - for (auto bbid : rset) { - BB *bb = GetId2bb(bbid); - if (bb->GetKind() == BB::kBBGoto && bb->NumInsn() == 1) { -#if RS_DUMP - M_LOG << "Restores in splitted empty BB" << bbid << "\n"; -#endif - aarchCGFunc->GetProEpilogSavedRegs().clear(); - const MapleVector &calleesNew = aarchCGFunc->GetCalleeSavedRegs(); - for (auto areg : calleesNew) { - aarchCGFunc->GetProEpilogSavedRegs().push_back(areg); - } - return false; - } - } if (wkCand.restoreAtEpilog) { /* Restore cannot be applied, skip this reg and place save/restore in prolog/epilog */ -- Gitee From 8963495430aff5992904ff726f008b93db02feb6 Mon Sep 17 00:00:00 2001 From: Alfred Huang Date: Tue, 6 Sep 2022 13:06:26 -0700 Subject: [PATCH 2/3] More cleanup for regsaves --- .../include/cg/aarch64/aarch64_regsaves.h | 16 ++++++- .../src/cg/aarch64/aarch64_regsaves.cpp | 45 +++++++++++-------- src/mapleall/maple_be/src/cg/regsaves.cpp | 2 +- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h index 04cba909cc..18a3801980 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h @@ -111,6 +111,7 @@ class SavedBBInfo { MapleSet bbList; }; +#ifdef REMOVE_DOM_REDUNDANCY /* Info for BBs reachable from current BB */ class ReachInfo { public: @@ -130,7 +131,7 @@ class ReachInfo { private: MapleSet bbList; }; - +#endif class AArch64RegSavesOpt : public RegSavesOpt { public: @@ -140,22 +141,26 @@ class AArch64RegSavesOpt : public RegSavesOpt { pDomInfo(&pdom), bbSavedRegs(alloc.Adapter()), regSavedBBs(alloc.Adapter()), +#ifdef REMOVE_DOM_REDUNDANCY reachingBBs(alloc.Adapter()), +#endif regOffset(alloc.Adapter()), visited(alloc.Adapter()), id2bb(alloc.Adapter()) { bbSavedRegs.resize(func.NumBBs()); - regSavedBBs.resize(sizeof(CalleeBitsType)<<3); for (size_t i = 0; i < bbSavedRegs.size(); ++i) { bbSavedRegs[i] = nullptr; } + regSavedBBs.resize(sizeof(CalleeBitsType)<<3); for (size_t i = 0; i < regSavedBBs.size(); ++i) { regSavedBBs[i] = nullptr; } +#ifdef REMOVE_DOM_REDUNDANCY reachingBBs.resize(func.NumBBs()); for (size_t i = 0; i < bbSavedRegs.size(); ++i) { reachingBBs[i] = nullptr; } +#endif } ~AArch64RegSavesOpt() override = default; @@ -180,14 +185,17 @@ class AArch64RegSavesOpt : public RegSavesOpt { BB* FindLoopDominator(BB *bb, regno_t reg, bool *done); void CheckAndRemoveBlksFromCurSavedList(SavedBBInfo *sp, BB *bbDom, regno_t reg); void DetermineCalleeSaveLocationsDoms(); + void RevertToRestoreAtEpilog(AArch64reg reg); void DetermineCalleeSaveLocationsPre(); bool DetermineCalleeRestoreLocations(); int32 FindCalleeBase() const; void AdjustRegOffsets(); void InsertCalleeSaveCode(); void InsertCalleeRestoreCode(); +#ifdef REMOVE_DOM_REDUNDANCY void CreateReachingBBs(ReachInfo &rp, const BB &bb); BB* RemoveRedundancy(BB *startbb, regno_t reg); +#endif void PrintSaveLocs(AArch64reg reg); void Verify(regno_t reg, BB* bb, std::set *visited, uint32 *s, uint32 *r); void Run() override; @@ -269,12 +277,14 @@ class AArch64RegSavesOpt : public RegSavesOpt { return bbSavedRegs[bid]; } +#ifdef REMOVE_DOM_REDUNDANCY ReachInfo *GetReachingEntry(BBID bid) { if (reachingBBs[bid] == nullptr) { reachingBBs[bid] = memPool->New(alloc); } return reachingBBs[bid]; } +#endif void SetId2bb(BB *bb) { id2bb[bb->GetId()] = bb; @@ -293,7 +303,9 @@ class AArch64RegSavesOpt : public RegSavesOpt { CalleeBitsType *calleeBitsAcc = nullptr; MapleVector bbSavedRegs; /* set of regs to be saved in a BB */ MapleVector regSavedBBs; /* set of BBs to be saved for a reg */ +#ifdef REMOVE_DOM_REDUNDANCY MapleVector reachingBBs; /* set of BBs reachable from a BB */ +#endif MapleMap regOffset; /* save offset of each register */ MapleSet visited; /* temp */ MapleMap id2bb; /* bbid to bb* mapping */ diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp index 24f95a4aac..4892030624 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp @@ -31,6 +31,7 @@ namespace maplebe { continue; \ } +#ifdef REMOVE_DOM_REDUNDANCY void AArch64RegSavesOpt::CreateReachingBBs(ReachInfo &rp, const BB &bb) { (void)visited.insert(bb.GetId()); (void)rp.GetBBList().insert(bb.GetId()); @@ -43,6 +44,7 @@ void AArch64RegSavesOpt::CreateReachingBBs(ReachInfo &rp, const BB &bb) { M_LOG << " --ReachingBBs for BB " << bb.GetId() << " created\n"; #endif } +#endif void AArch64RegSavesOpt::InitData() { calleeBitsDef = cgFunc->GetMemoryPool()->NewArray(cgFunc->NumBBs()); @@ -606,6 +608,25 @@ void AArch64RegSavesOpt::CheckCriticalEdge(BB *bb, AArch64reg reg) { } } +/* Restore cannot be applied, skip this reg and place save/restore + in prolog/epilog */ +void AArch64RegSavesOpt::RevertToRestoreAtEpilog(AArch64reg reg) { + AArch64CGFunc *aarchCGFunc = static_cast(cgFunc); + for (size_t bid = 1; bid < bbSavedRegs.size(); ++bid) { + SavedRegInfo *sp = bbSavedRegs[bid]; + if (sp != nullptr && !sp->GetSaveSet().empty() && sp->ContainSaveReg(reg)) { + sp->RemoveSaveReg(reg); + } + } + MapleVector &pe = aarchCGFunc->GetProEpilogSavedRegs(); + if (std::find(pe.begin(), pe.end(), reg) == pe.end()) { + pe.push_back(reg); + } +#if RS_DUMP + M_LOG << "Restore R" << (reg - 1) << " n/a, do in Pro/Epilog\n"; +#endif +} + /* Determine calleesave regs restore locations by calling ssu-pre, previous bbSavedRegs memory is cleared and restore locs recorded in it */ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { @@ -639,21 +660,7 @@ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { wkCand.restoreAtEpilog = true; } if (wkCand.restoreAtEpilog) { - /* Restore cannot be applied, skip this reg and place save/restore - in prolog/epilog */ - for (size_t bid = 1; bid < bbSavedRegs.size(); ++bid) { - SavedRegInfo *sp = bbSavedRegs[bid]; - if (sp != nullptr && !sp->GetSaveSet().empty() && sp->ContainSaveReg(reg)) { - sp->RemoveSaveReg(reg); - } - } - MapleVector &pe = aarchCGFunc->GetProEpilogSavedRegs(); - if (std::find(pe.begin(), pe.end(), reg) == pe.end()) { - pe.push_back(reg); - } -#if RS_DUMP - M_LOG << "Restore R" << (reg - 1) << " n/a, do in Pro/Epilog\n"; -#endif + RevertToRestoreAtEpilog(reg); continue; } if (!wkCand.restoreAtEntryBBs.empty() || !wkCand.restoreAtExitBBs.empty()) { @@ -671,9 +678,11 @@ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { } Insn *lastInsn = bb->GetLastMachineInsn(); if (lastInsn != nullptr && (lastInsn->IsBranch() || lastInsn->IsTailCall()) && - (!lastInsn->GetOperand(0).IsRegister() || /* not a reg OR */ - (!AArch64Abi::IsCalleeSavedReg( /* reg but not cs */ - static_cast(static_cast(lastInsn->GetOperand(0)).GetRegisterNumber()))))) { + lastInsn->GetOperand(0).IsRegister() && + static_cast(lastInsn->GetOperand(0)).GetRegisterNumber() == reg) { + RevertToRestoreAtEpilog(reg); + } + if (lastInsn != nullptr && (lastInsn->IsBranch() || lastInsn->IsTailCall())) { /* To insert in this block - 1 instr */ SavedRegInfo *sp = GetbbSavedRegsEntry(exitBB); sp->InsertExitReg(reg); diff --git a/src/mapleall/maple_be/src/cg/regsaves.cpp b/src/mapleall/maple_be/src/cg/regsaves.cpp index dde245f97f..d48d3ef3d0 100644 --- a/src/mapleall/maple_be/src/cg/regsaves.cpp +++ b/src/mapleall/maple_be/src/cg/regsaves.cpp @@ -44,7 +44,7 @@ bool CgRegSavesOpt::PhaseRun(maplebe::CGFunc &f) { DomAnalysis *dom = nullptr; PostDomAnalysis *pdom = nullptr; if (Globals::GetInstance()->GetOptimLevel() >= 1 && - f.GetCG()->GetCGOptions().DoColoringBasedRegisterAllocation()) { + f.GetCG()->GetCGOptions().DoRegSavesOpt()) { MaplePhase *phase = GetAnalysisInfoHook()-> ForceRunAnalysisPhase, CGFunc>(&CgDomAnalysis::id, f); dom = static_cast(phase)->GetResult(); -- Gitee From 29569329afec56630d3b4a7bf2ff72157357a31a Mon Sep 17 00:00:00 2001 From: Alfred Huang Date: Fri, 16 Sep 2022 13:23:13 -0700 Subject: [PATCH 3/3] Get rid of unneeded return type for DetermineCalleeRestoreLocations() --- .../maple_be/include/cg/aarch64/aarch64_regsaves.h | 2 +- src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h index 18a3801980..516e323679 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_regsaves.h @@ -187,7 +187,7 @@ class AArch64RegSavesOpt : public RegSavesOpt { void DetermineCalleeSaveLocationsDoms(); void RevertToRestoreAtEpilog(AArch64reg reg); void DetermineCalleeSaveLocationsPre(); - bool DetermineCalleeRestoreLocations(); + void DetermineCalleeRestoreLocations(); int32 FindCalleeBase() const; void AdjustRegOffsets(); void InsertCalleeSaveCode(); diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp index a3b9c9418c..c615efb67d 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_regsaves.cpp @@ -629,7 +629,7 @@ void AArch64RegSavesOpt::RevertToRestoreAtEpilog(AArch64reg reg) { /* Determine calleesave regs restore locations by calling ssu-pre, previous bbSavedRegs memory is cleared and restore locs recorded in it */ -bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { +void AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { AArch64CGFunc *aarchCGFunc = static_cast(cgFunc); MapleAllocator sprealloc(memPool); #if RS_DUMP @@ -700,7 +700,6 @@ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { } } } - return true; } int32 AArch64RegSavesOpt::FindCalleeBase() const { @@ -995,11 +994,8 @@ void AArch64RegSavesOpt::Run() { /* Obsolete, to be deleted */ DetermineCalleeSaveLocationsDoms(); } - /* Determine restore sites */ - if (!DetermineCalleeRestoreLocations()) { - return; - } + DetermineCalleeRestoreLocations(); #ifdef VERIFY /* Verify saves/restores are in pair */ -- Gitee