https://gcc.gnu.org/bugzilla/show_bug.cgi?id=128648
Bug ID: 128648
Summary: [14/15/16/17 Regression] wrong code at -O3: loop
interchange ignores output dependence of a[j + 2*k]
(distance (2,-1)) since r8-5164
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Keywords: 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 + 2 * k] = j;
printf("%d\n", a[2]);
}
$ gcc -O0 t.c && ./a.out
2
$ gcc -O3 t.c && ./a.out
0
Expected: 2. a[2] is written by (j=0, k=1) and later by (j=2, k=0), so a[2] =
2. After interchange the order changes and a[2] = 0. "loops interchanged in
loop nest".
Suspected cause: tree-loop-interchange: tree_loop_interchange_compute_ddrs does
not build self dependences, so the (2,-1) output dependence is not checked
(pass since fbdec14e80e, 2017, GCC 8).
Avoided by: -fno-loop-interchange.
Known to fail: 8.5.0, 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.
-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