finite_loop_p tweak
We have finite_p flag in loop structure. finite_loop_p already know to use it, but we also may set the flag when we prove loop to be finite by SCEV analysis to avoid duplicated work. Bootstrapped/regtested x86_64-linux, OK? gcc/ChangeLog: * tree-ssa-loop-niter.cc (finite_loop_p): Reorder to do cheap tests first; update finite_p flag.
This commit is contained in:
parent
15ec8d5ab5
commit
3038d59852
1 changed files with 26 additions and 19 deletions
|
@ -3338,24 +3338,6 @@ finite_loop_p (class loop *loop)
|
|||
widest_int nit;
|
||||
int flags;
|
||||
|
||||
flags = flags_from_decl_or_type (current_function_decl);
|
||||
if ((flags & (ECF_CONST|ECF_PURE)) && !(flags & ECF_LOOPING_CONST_OR_PURE))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, "Found loop %i to be finite: it is within pure or const function.\n",
|
||||
loop->num);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (loop->any_upper_bound
|
||||
|| max_loop_iterations (loop, &nit))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, "Found loop %i to be finite: upper bound found.\n",
|
||||
loop->num);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (loop->finite_p)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -3368,11 +3350,36 @@ finite_loop_p (class loop *loop)
|
|||
{
|
||||
if (dump_file)
|
||||
fprintf (dump_file, "Assume loop %i to be finite: it has an exit "
|
||||
"and -ffinite-loops is on.\n", loop->num);
|
||||
"and -ffinite-loops is on or loop was "
|
||||
"previously finite.\n",
|
||||
loop->num);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
flags = flags_from_decl_or_type (current_function_decl);
|
||||
if ((flags & (ECF_CONST|ECF_PURE)) && !(flags & ECF_LOOPING_CONST_OR_PURE))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file,
|
||||
"Found loop %i to be finite: it is within "
|
||||
"pure or const function.\n",
|
||||
loop->num);
|
||||
loop->finite_p = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (loop->any_upper_bound
|
||||
/* Loop with no normal exit will not pass max_loop_iterations. */
|
||||
|| (!loop->finite_p && max_loop_iterations (loop, &nit)))
|
||||
{
|
||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||
fprintf (dump_file, "Found loop %i to be finite: upper bound found.\n",
|
||||
loop->num);
|
||||
loop->finite_p = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue