https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118298

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2025-01-07
     Ever confirmed|0                           |1
          Component|middle-end                  |rtl-optimization

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
So decide_unroll_runtime_iterations figures

  if (desc->const_iter)
    {
      if (dump_file)
        fprintf (dump_file, ";; Loop iterates constant times\n");
      return;
    }

but decide_unroll_constant_iterations doesn't honor loop->unroll as we
bail out too early.  The following fixes this for me:

iff --git a/gcc/loop-unroll.cc b/gcc/loop-unroll.cc
index 2bd6e888b26..b4952055318 100644
--- a/gcc/loop-unroll.cc
+++ b/gcc/loop-unroll.cc
@@ -372,7 +372,8 @@ decide_unroll_constant_iterations (class loop *loop, int
flags)
     nunroll = targetm.loop_unroll_adjust (nunroll, loop);

   /* Skip big loops.  */
-  if (nunroll <= 1)
+  if (nunroll <= 1
+      && !(loop->unroll > 1 && loop->unroll < USHRT_MAX))
     {
       if (dump_file)
        fprintf (dump_file, ";; Not considering loop, is too big\n");

Reply via email to