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

            Bug ID: 102666
           Summary: Wrong loop optimization for unsigned types
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: davidsondfgl at gmail dot com
  Target Milestone: ---

The code below produces incorrect result when any optimizations (-O1/-O2/-O3)
are enabled:

$ cat unsigned-bug.c
int main(void) {
    for (unsigned a = 0, b = 0; a < 6; a += 1, b += 2)
        if (b < a)
            return 1;
    return 0;
}

$ gcc -Wall -Wextra unsigned-bug.c; ./a.out; echo $?
0
$ gcc -Wall -Wextra unsigned-bug.c -O1; ./a.out; echo $?
1
$ gcc -Wall -Wextra unsigned-bug.c -O2; ./a.out; echo $?
1
$ gcc -Wall -Wextra unsigned-bug.c -O3; ./a.out; echo $?
1

This affects all releases as of 9.1, including the master branch (commit
2b30143).

A bisect between v9.1 and v8.3 indicates that this may have been introduced in
r266171, as I can revert this commit (a81e2c6) in all releases up to v11.2 and
get the expected behavior.

It is also worthwhile to note that this only occurs for unsigned types.

Reply via email to