Message ID | ZLpvtOUb8IBYs7zT@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
Series | finite_loop_p tweak | expand |
On Fri, Jul 21, 2023 at 1:45 PM Jan Hubicka via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi, > 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? OK > gcc/ChangeLog: > > * tree-ssa-loop-niter.cc (finite_loop_p): Reorder to do cheap > tests first; update finite_p flag. > > diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc > index 3c4e66291fb..e5985bee235 100644 > --- a/gcc/tree-ssa-loop-niter.cc > +++ b/gcc/tree-ssa-loop-niter.cc > @@ -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; > } >
diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc index 3c4e66291fb..e5985bee235 100644 --- a/gcc/tree-ssa-loop-niter.cc +++ b/gcc/tree-ssa-loop-niter.cc @@ -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; }