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

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|NEW                         |ASSIGNED

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/674586.html fixes the
issue it seems.  That's a "correct" side-effect in that the

        int h = 0;
        do {
            int b = 0;
            int *l = &b;
            h = 0;
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < f; k++)
                    h+= !!l[k];
            }
        } while (h);

is not known to be finite.  In the end this tickles down via ranges to

-Loop 4 iterates at most 14 times.
-Loop 4 likely iterates at most 14 times.
+Loop 4 iterates at most 61 times.
+Loop 4 likely iterates at most 61 times.

(that's the main vector loop).

Looking at Andrews testcase we have

        int f = c - 5;                         //  f == -5
        //__builtin_printf("%d\n", f);
        int h = 0;
        do {
            int b = 0;
            int *l = &b; 
            h = 0;
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < f; k++)    // 0 < -5, so the loop doesn't
enter
                    h+= !!l[k];

but with -O3 we hit a vector load of &b that was hoisted across the f > 0
check by LIM and that traps.

Reply via email to