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

            Bug ID: 118294
           Summary: GCC doesn't unroll the outer loop of a nest where the
                    outer body trivially only runs once
           Product: gcc
           Version: 15.0
               URL: https://godbolt.org/z/G7WfxM3e7
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tiborgyri at gmail dot com
  Target Milestone: ---

In this example: https://godbolt.org/z/G7WfxM3e7
the outer loop "for (TT j=0; j<Nperm; j++)" trivially never loops, since
Nperm=1 and the loop body does not modify j. This means there is no point in
not unrolling it trivially (trip count of 1), which is what clang does.

For some reason GCC gets confused by this loop nest and writes messages into
the optimization log like:
"not vectorized: could not determine main exit from loop with multiple exits"
I do not see any multiple exits.

Also, there is this message in stdout which I find slightly suspicious:
"hotter_than_inner_loop is NULL". hotter_than_inner_loop sounds like something
that should be a bool, so it being NULL is a bit funky, but I do not know GCC's
internals enough to tell if that indicates a bug.

Note that increasing Nperm to 2 results in the outer loop being correctly
unrolled, so only the edge case of the loop body getting executed only once is
mishandled.

I am not sure which component is responsible for this, as other unroll related
bugs seem to be spread across middle-end/rtl/tree, so I am filing this for
tree-optimization as a guess.

Reply via email to