diff --git a/src/mapleall/maple_me/include/me_option.h b/src/mapleall/maple_me/include/me_option.h index 4399cec3078a75f530a49a59b082e67ed1e77417..174a592eb690bd813f3465e8701939229d443171 100644 --- a/src/mapleall/maple_me/include/me_option.h +++ b/src/mapleall/maple_me/include/me_option.h @@ -174,6 +174,7 @@ class MeOption : public MapleDriverOptionBase { static uint32 sinkLimit; static uint32 sinkPULimit; static uint32 vecLoopLimit; + static uint32 ivoptsLimit; static bool loopVec; static bool seqVec; static uint8 rematLevel; diff --git a/src/mapleall/maple_me/src/me_ivopts.cpp b/src/mapleall/maple_me/src/me_ivopts.cpp index 8310b9003ee6fddd85e5a2d5c05da84056c5a91e..d448eb39ab170ffa25662443418817f4ae0dae73 100644 --- a/src/mapleall/maple_me/src/me_ivopts.cpp +++ b/src/mapleall/maple_me/src/me_ivopts.cpp @@ -2362,6 +2362,9 @@ void IVOptimizer::Run() { CR *itCR = nullptr; TripCountType type = sa.ComputeTripCount(func, tripCount, conditionCRNode, itCR); data->iterNum = type == kConstCR ? tripCount : kDefaultEstimatedLoopIterNum; + if ((loops->GetMeLoops().size() - i) > MeOption::ivoptsLimit) { + break; + } ApplyOptimize(); } useInfo->InvalidUseInfo(); diff --git a/src/mapleall/maple_me/src/me_option.cpp b/src/mapleall/maple_me/src/me_option.cpp index 6f2003c0c78d6de38e734e8f534ec7410f70b456..56fefb5f53bfd1658435d87250657a8ebc104c0b 100644 --- a/src/mapleall/maple_me/src/me_option.cpp +++ b/src/mapleall/maple_me/src/me_option.cpp @@ -59,6 +59,7 @@ uint32 MeOption::rename2pregLimit = UINT32_MAX; uint32 MeOption::propLimit = UINT32_MAX; uint32 MeOption::copyPropLimit = UINT32_MAX; uint32 MeOption::vecLoopLimit = UINT32_MAX; +uint32 MeOption::ivoptsLimit = UINT32_MAX; uint32 MeOption::profileBBHotRate = 10; uint32 MeOption::profileBBColdRate = 99; bool MeOption::noDelegateRC = false; @@ -256,6 +257,7 @@ enum OptionIndex { kRematLevel, kLayoutWithPredict, kvecLoops, + kIvoptsLimit, }; const Descriptor kUsage[] = { @@ -1228,7 +1230,17 @@ const Descriptor kUsage[] = { kBuildTypeExperimental, kArgCheckPolicyRequired, " --veclooplimit \tApply vectorize loops only up to NUM \n" - " \t--copyproplimit=NUM\n", + " \t--veclooplimit=NUM\n", + "me", + {} }, + { kIvoptsLimit, + 0, + "", + "ivoptslimit", + kBuildTypeExperimental, + kArgCheckPolicyRequired, + " --ivoptslimit \tApply ivopts only up to NUM loops \n" + " \t--ivoptslimit=NUM\n", "me", {} }, #if MIR_JAVA @@ -1720,6 +1732,9 @@ bool MeOption::SolveOptions(const std::deque &opts, bool is case kvecLoops: vecLoopLimit = std::stoul(opt.Args(), nullptr); break; + case kIvoptsLimit: + ivoptsLimit = std::stoul(opt.Args(), nullptr); + break; #if MIR_JAVA case kMeAcquireFunc: acquireFuncName = opt.Args();