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 04cba909cc022af618a0515d166cf6c5e9a5f4c3..516e3236790bba3c5ef7a2de0d0e9bda779447cc 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(); + void 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 ab22944bc9c3d8d167cfc14c7454346dfc3d96c8..c615efb67de643a8466b346d6007555cf7150ccc 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()); @@ -195,19 +197,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 +210,6 @@ void AArch64RegSavesOpt::GenAccDefs() { if (IsBackEdge(bb, pred)) { continue; } - if (BBHasTerminalCall(*pred)) { - continue; - } tmp &= GetBBCalleeBits(GetCalleeBitsAcc(), pred->GetId()); } SetCalleeBit(GetCalleeBitsAcc(), bb->GetId(), curbbBits | tmp); @@ -622,9 +608,28 @@ 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() { +void AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { AArch64CGFunc *aarchCGFunc = static_cast(cgFunc); MapleAllocator sprealloc(memPool); #if RS_DUMP @@ -654,41 +659,8 @@ 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 */ - 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()) { @@ -706,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); @@ -726,7 +700,6 @@ bool AArch64RegSavesOpt::DetermineCalleeRestoreLocations() { } } } - return true; } int32 AArch64RegSavesOpt::FindCalleeBase() const { @@ -1021,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 */