[IndVars] Extend diagnostic -replexitval flag w/ability to bypass hard use hueristic

Note: This does mean that "always" is now more powerful than it was. 
llvm-svn: 363196
This commit is contained in:
Philip Reames 2019-06-12 19:52:05 +00:00
parent b05ce7f9f7
commit ae2581cef3
1 changed files with 5 additions and 2 deletions

View File

@ -100,7 +100,7 @@ static cl::opt<bool> VerifyIndvars(
"verify-indvars", cl::Hidden,
cl::desc("Verify the ScalarEvolution result after running indvars"));
enum ReplaceExitVal { NeverRepl, OnlyCheapRepl, AlwaysRepl };
enum ReplaceExitVal { NeverRepl, OnlyCheapRepl, NoHardUse, AlwaysRepl };
static cl::opt<ReplaceExitVal> ReplaceExitValue(
"replexitval", cl::Hidden, cl::init(OnlyCheapRepl),
@ -108,6 +108,8 @@ static cl::opt<ReplaceExitVal> ReplaceExitValue(
cl::values(clEnumValN(NeverRepl, "never", "never replace exit value"),
clEnumValN(OnlyCheapRepl, "cheap",
"only replace exit value when the cost is cheap"),
clEnumValN(NoHardUse, "noharduse",
"only replace exit values when loop def likely dead"),
clEnumValN(AlwaysRepl, "always",
"always replace exit value whenever possible")));
@ -632,7 +634,8 @@ bool IndVarSimplify::rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
// Computing the value outside of the loop brings no benefit if it is
// definitely used inside the loop in a way which can not be optimized
// away.
if (!isa<SCEVConstant>(ExitValue) && hasHardUserWithinLoop(L, Inst))
if (ReplaceExitValue != AlwaysRepl &&
!isa<SCEVConstant>(ExitValue) && hasHardUserWithinLoop(L, Inst))
continue;
bool HighCost = Rewriter.isHighCostExpansion(ExitValue, L, Inst);