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

            Bug ID: 61569
           Summary: faggressive-loop-optimizations overoptimize loop
                    checks with unpredicted result
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: n-gcc at nn dot kiev.ua

The following program performs 112 iterations (and stop on x==1) instead of
expected 10 ones.

#include <stdio.h>

int main()
{
    int i, x = 27;
    for (i = 0; i < 10; ++i)
    {
        printf("%11d : %11d : %d\n", i, i*1000000000, x);
        if (x==1) break;
        x = x%2 ? x*3+1 : x/2;
    }
    return 0;
}

With a small change, it, instead, limits itself to 3 iterations.

#include <stdio.h>

int main()
{
    int i, j, x = 27;
    for (i = j = 0; i < 10; ++i, ++j)
    {
        printf("%11d : %11d : %d\n", i, j*1000000000, x);
        if (x==1) break;
        x = x%2 ? x*3+1 : x/2;
    }
    return 0;
}

Conditions to represent the issue are:
1. gcc after 4.8.0 (my versions gcc48-4.8.4.s20140605 and gcc49-4.9.1.s20140611
from FreeBSD ports).
2. -O2 or higher, or -Os.

The issue goes after any of the following options added:
* -fno-aggressive-loop-optimizations
* -fno-strict-overflow
* -fwrapv or -ftrapv (obviously)

Stage dump analysis shows that loop exit condition check (i<10 in that code
examples, i<=9 internally after some change) is gone away at 056t.cunrolli.

Adding of -Wstrict-overflow of any level doesn't cause warning emission.

The similar issue was reported in #58143 comment 9, and #53265 seems devoted to
lack of warning, but I'm not sure cases are equal.

Disclaimer: I'm aware of standard's statement "signed integer overflow is UB"
but I'm confident that a respected common-goal compiler should thoroughly limit
this UB to result value of the operator itself and avoid expanding it to any
other program action.

Thanks to: livejournal.com user _winnie for issue finding; user kodt_rsdn
(Nikolay Merkin) for the clear example designing; Serge Ryabchun for diagnosing
-faggressive-loop-optimizations influence.

Reply via email to