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

            Bug ID: 128649
           Summary: [14/15/16/17 Regression] wrong code at -O3: outer-loop
                    vectorization ignores self output dependence of a[j +
                    k]
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: needs-bisection, wrong-code
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jeffchen006 at gmail dot com
  Target Milestone: ---

int printf(const char *, ...);
int a[32], n = 2;
int main(void) {
  for (int j = 0; j < 3; j++)
    for (int k = 0; k < n; k++)
      a[j + k] = j;
  printf("%d\n", a[1]);
}

$ gcc -O0 t.c && ./a.out
1
$ gcc -O3 t.c && ./a.out
0

Expected: 1. a[1] is written by (j=0, k=1) and later by (j=1, k=0), so a[1] =
1. The outer j loop is vectorized ("loop vectorized using 8 byte vectors and
unroll factor 2") and the order changes. A related form (a[i + 2*j]) also fails
on 7.5.0.

Suspected cause: vectorizer data dependence analysis skips the self dependence
(dra == drb) with distance (1,-1) for outer-loop vectorization.

Avoided by: -fno-tree-loop-vectorize.

Known to fail: 10.5.0, 11.4.0, 12.5.0, 13.4.0, 14.3.0, 15.2.0, 16.2.0, 17.0.

Known to work: 7.5.0, 8.5.0.

-O0 -fsanitize=undefined,address is clean.

gcc version 17.0.0 20261111 (experimental) (a2a11abfad3), x86_64-pc-linux-gnu
Configured with: --enable-languages=c,c++ --disable-multilib
--disable-bootstrap --enable-checking=release
  • [Bug tree-optimization/128649] N... jeffchen006 at gmail dot com via Gcc-bugs

Reply via email to