diff --git a/src/mapleall/maple_be/include/cg/cgfunc.h b/src/mapleall/maple_be/include/cg/cgfunc.h index b678bf79e4e626a785d85bd043dfc58b30ceba42..d5707e66c910c239e45ed001d20c2bbcd1cf8bae 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 471819cd1129b1d75d77dc925ef3d7da23192202..62b60fc23361105629c97767d54e772a6fe87f19 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() >= kRematConst && lr.IsRematerializable(*a64CGFunc, kRematConst)) { - lr.SetRematLevel(kRematConst); - } else if (cg->GetRematLevel() >= kRematAddr && lr.IsRematerializable(*a64CGFunc, kRematAddr)) { - lr.SetRematLevel(kRematAddr); - } else if (cg->GetRematLevel() >= kRematDreadLocal && lr.IsRematerializable(*a64CGFunc, kRematDreadLocal)) { - lr.SetRematLevel(kRematDreadLocal); - } else if (cg->GetRematLevel() >= kRematDreadGlobal && lr.IsRematerializable(*a64CGFunc, kRematDreadGlobal)) { - lr.SetRematLevel(kRematDreadGlobal); + if (cgFunc->GetCG()->IsLmbc()) { + lr.SetRematLevel(kRematOff); + } else { + if (cg->GetRematLevel() >= kRematConst && lr.IsRematerializable(*a64CGFunc, kRematConst)) { + lr.SetRematLevel(kRematConst); + } else if (cg->GetRematLevel() >= kRematAddr && lr.IsRematerializable(*a64CGFunc, kRematAddr)) { + lr.SetRematLevel(kRematAddr); + } else if (cg->GetRematLevel() >= kRematDreadLocal && lr.IsRematerializable(*a64CGFunc, kRematDreadLocal)) { + lr.SetRematLevel(kRematDreadLocal); + } else if (cg->GetRematLevel() >= kRematDreadGlobal && lr.IsRematerializable(*a64CGFunc, kRematDreadGlobal)) { + lr.SetRematLevel(kRematDreadGlobal); + } } 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 502983b519e5c61e91cf0bbaa3bf7a1194ec73be..d8b5e862787bc9d5af187b7a01e8273b7eea6fb0 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 788a763a8e258d517b60cee902a55894f07e5f3d..c31731265a9a846d9c24886eb3889268110624e2 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()) {