From 05b644ee6220e06b4b294a44d5ff0959603733d2 Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 6 Jul 2022 10:15:51 -0700 Subject: [PATCH] Turn off rematerialization for lmbc. Merge return bb for small C functions. --- src/mapleall/maple_be/include/cg/cgfunc.h | 1 + .../src/cg/aarch64/aarch64_color_ra.cpp | 20 +++++++++++-------- src/mapleall/maple_be/src/cg/cgbb.cpp | 1 + src/mapleall/maple_be/src/cg/cgfunc.cpp | 3 ++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/cgfunc.h b/src/mapleall/maple_be/include/cg/cgfunc.h index b678bf79e4..d5707e66c9 100644 --- a/src/mapleall/maple_be/include/cg/cgfunc.h +++ b/src/mapleall/maple_be/include/cg/cgfunc.h @@ -81,6 +81,7 @@ class SpillMemOperandSet { class LiveRange; #endif /* TARGARM32 */ constexpr uint32 kVRegisterNumber = 80; +constexpr uint32 kNumBBOptReturn = 30; class CGFunc { public: enum ShiftDirection : uint8 { diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp index f3b666c4f1..c0b4bf5050 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp @@ -455,14 +455,18 @@ void GraphColorRegAllocator::CalculatePriority(LiveRange &lr) const { auto *a64CGFunc = static_cast(cgFunc); CG *cg = a64CGFunc->GetCG(); - if (cg->GetRematLevel() >= rematConst && lr.IsRematerializable(*a64CGFunc, rematConst)) { - lr.SetRematLevel(rematConst); - } else if (cg->GetRematLevel() >= rematAddr && lr.IsRematerializable(*a64CGFunc, rematAddr)) { - lr.SetRematLevel(rematAddr); - } else if (cg->GetRematLevel() >= rematDreadLocal && lr.IsRematerializable(*a64CGFunc, rematDreadLocal)) { - lr.SetRematLevel(rematDreadLocal); - } else if (cg->GetRematLevel() >= rematDreadGlobal && lr.IsRematerializable(*a64CGFunc, rematDreadGlobal)) { - lr.SetRematLevel(rematDreadGlobal); + if (cgFunc->GetCG()->IsLmbc()) { + lr.SetRematLevel(rematOff); + } else { + if (cg->GetRematLevel() >= rematConst && lr.IsRematerializable(*a64CGFunc, rematConst)) { + lr.SetRematLevel(rematConst); + } else if (cg->GetRematLevel() >= rematAddr && lr.IsRematerializable(*a64CGFunc, rematAddr)) { + lr.SetRematLevel(rematAddr); + } else if (cg->GetRematLevel() >= rematDreadLocal && lr.IsRematerializable(*a64CGFunc, rematDreadLocal)) { + lr.SetRematLevel(rematDreadLocal); + } else if (cg->GetRematLevel() >= rematDreadGlobal && lr.IsRematerializable(*a64CGFunc, rematDreadGlobal)) { + lr.SetRematLevel(rematDreadGlobal); + } } auto calculatePriorityFunc = [&lr, &bbNum, &numDefs, &numUses, &pri, this] (uint32 bbID) { diff --git a/src/mapleall/maple_be/src/cg/cgbb.cpp b/src/mapleall/maple_be/src/cg/cgbb.cpp index 502983b519..d8b5e86278 100644 --- a/src/mapleall/maple_be/src/cg/cgbb.cpp +++ b/src/mapleall/maple_be/src/cg/cgbb.cpp @@ -525,6 +525,7 @@ void Bfs::ComputeBlockOrder() { done = true; } else { LogInfo::MapleLogger() << "Error: RA BFS loop " << sortedCnt << " in func " << cgfunc->GetName() << "\n"; + CHECK_FATAL(false, ""); } } sortedCnt = sortedBBs.size(); diff --git a/src/mapleall/maple_be/src/cg/cgfunc.cpp b/src/mapleall/maple_be/src/cg/cgfunc.cpp index 788a763a8e..c31731265a 100644 --- a/src/mapleall/maple_be/src/cg/cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/cgfunc.cpp @@ -2074,7 +2074,8 @@ void CGFunc::HandleFunction() { /* select instruction */ GenerateInstruction(); /* merge multi return */ - if (!func.GetModule()->IsCModule() || CGOptions::DoRetMerge() || CGOptions::OptimizeForSize()) { + if (!func.GetModule()->IsCModule() || (func.GetModule()->IsCModule() && (NumBBs() < kNumBBOptReturn)) || + CGOptions::DoRetMerge() || CGOptions::OptimizeForSize()) { MergeReturn(); } if (func.IsJava()) { -- Gitee