https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68730
Bug ID: 68730 Summary: wrong code at -O3 on x86_64-linux-gnu (in 32-bit mode) Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: su at cs dot ucdavis.edu Target Milestone: --- The current gcc trunk miscompiles the following code on x86_64-linux-gnu at -O3 in the 32-bit mode (but not in the 64-bit mode). This is a regression from 5.3.x. -fno-tree-vrp makes the miscompilation disappear. $ gcc-trunk -v Using built-in specs. COLLECT_GCC=gcc-trunk COLLECT_LTO_WRAPPER=/usr/local/gcc-trunk/libexec/gcc/x86_64-pc-linux-gnu/6.0.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-trunk/configure --prefix=/usr/local/gcc-trunk --enable-languages=c,c++ --disable-werror --enable-multilib Thread model: posix gcc version 6.0.0 20151204 (experimental) [trunk revision 231299] (GCC) $ $ gcc-trunk -m32 -O2 small.c; ./a.out -28479 -28479 1 $ gcc-trunk -m64 -O3 small.c; ./a.out -28479 -28479 1 $ gcc-5.3 -m32 -O3 small.c; ./a.out -28479 -28479 1 $ $ gcc-trunk -m32 -O3 -fno-tree-vrp small.c; ./a.out -28479 -28479 1 $ $ gcc-trunk -m32 -O3 small.c $ timeout -s 9 10 ./a.out -28479 -28479 -32319 Killed $ --------------------------------------------------- int printf (const char *, ...); int b, d, e; unsigned long long c = 4100543410106915; void fn1 () { short f, g = 4 % c; int h = c; if (h) { int i = ~c; if (~c) i = 25662; f = g = i; h = c - g + ~-f; c = ~(c * h - f); } f = g; unsigned long long k = g || c; short l = c ^ g ^ k; if (g > 25662 || c == 74074520320 || !(g < 2)) { k = c; l = g; c = ~((k && c) + ~l); f = ~(f * (c ^ k) | l); if (c > k) printf ("%d\n", f); } short m = -f; unsigned long long n = c; c = m * f | n % c; if (n) printf ("%d\n", f); while (f < -31807) ; c = ~(n | c) | f; if (n < c) printf ("%lld\n", (long long) f); for (; d;) for (; e;) for (;;) ; c = h; c = l % c; } int main () { for (; b < 2; b++) fn1 (); return 0; }