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

            Bug ID: 90796
           Summary: GCC: O2 vs O3 output differs on simple test
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: konstantin.vladimirov at gmail dot com
  Target Milestone: ---

Reproduction:

---
#include <stdio.h>
unsigned b[11];
unsigned c;
int d, e, f;
char en;
int main() {
  for (; e < 100; e += 3) {
    printf("b[0] = %u\n", b[0]);
    for (; c < 9; c++)
      for (d = 2; d < 11; d++) {
        f = b[c + 2] ^ 9;
        b[c] = f;
      }
  }
}
---

Compiler information:

---
> gcc -v
Using built-in specs.
COLLECT_GCC=/apps/bin/gcc
COLLECT_LTO_WRAPPER=/apps/9fafffe/bin/../libexec/gcc/x86_64-pc-linux-gnu/10.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /srcs/gcc/configure --disable-bootstrap --prefix=/apps/9fafffe
Thread model: posix
gcc version 10.0.0 20190608 (experimental) (GCC)
---

Compile and run like this:

> gcc -O2 min.c -o corr
> ./corr >& corr.log
> gcc -O3 min.c -o wrong
> ./wrong >& wrong.log

Correct output:

b[0] = 0
b[0] = 9
....
b[0] = 9

Wrong output:

b[0] = 0
b[0] = 0
....
b[0] = 0

O0 and O1 modes agree with O2.

Reply via email to