https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93434
Bug ID: 93434
Summary: Miscompilation with -O3 starting from 8.1
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: rlivings at mathworks dot com
Target Milestone: ---
We're working on upgrading our code base to GCC 8.3. In doing so one of our
tests started failing with a wrong answer. After narrowing down we see that the
code:
#include <stdio.h>
typedef struct creal_T {
double re;
double im;
} creal_T;
#define N 16
int main() {
int k;
int i;
int j;
creal_T t2[N];
double inval;
inval = 1.0;
for (j = 0; j < N; ++j) {
t2[j].re = 0;
t2[j].im = 0;
}
for (j = 0; j < N/4; j++) {
i = j * 4;
t2[i].re = inval;
t2[i].im = inval;
/* Uncomment for correct behavior */
/* printf("t2[%d] = %g + %g*i\n", i, t2[i].re, t2[i].im); */
k = i + 3;
t2[k].re = inval;
t2[k].im = inval;
t2[i] = t2[k];
t2[k].re = inval;
}
printf("\n");
for (i = 0; i < 2; ++i) {
printf("t2[%2d] = %g + %g*i\n", i, t2[i].re, t2[i].im);
}
}
generates a binary that prints:
t2[ 0] = 0 + 1*i
t2[ 1] = 0 + 0*i
when compiled without warnings:
-O3 -Wall -Wextra -fno-strict-aliasing -fwrapv
in GCC 8.1 up through trunk. The -O2 and lower output is the correct answer:
t2[ 0] = 1 + 1*i
t2[ 1] = 0 + 0*i
Adding -fsanitize=undefined,address runs without error and returns the expected
answer.
Godbolt link for reference:
https://godbolt.org/z/uxVJ2K
gcc -v
Using built-in specs.
COLLECT_GCC=.../gcc-8.3.0/bin/gcc
COLLECT_LTO_WRAPPER=.../gcc-8.3.0/bin/../libexec/gcc/x86_64-pc-linux-gnu/8.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: .../gcc-8.3/configure --with-gmp=.../gcc-8.3/gmp-4.3
--with-mpfr=../gcc-8.3/mpfr --with-mpc=...gcc-8.3/mpc
--enable-languages=c,c++,fortran --enable-shared --enable-linker-build-id
--enable-plugin --enable-checking=release --enable-multiarch --enable-gold
--enable-ld=default --enable-libstdcxx-time=no --prefix=gcc-8.3.0
--with-pkgversion='MW GCC 8.3.0-gold' --with-tune=generic --with-system-zlib
--enable-multilib --with-multilib-list=m32,m64 --with-arch-directory=amd64
--with-arch-32=i586 --with-abi=m64
Thread model: posix
gcc version 8.3.0 (GCC 8.3.0-gold)