https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108657
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #15 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly cleaned up; aborts with -O3 -ftrivial-auto-var-init=zero, doesn't abort with -O0, -O3 or -O0 -ftrivial-auto-var-init=zero. int m[256]; unsigned n = 4294967295; void foo (int b) { n = (n >> 8) ^ m[(n ^ b) & 255]; } void bar (long x) { n = (n >> 8) ^ m[(n ^ x) & 255]; foo (x >> 8); foo (x >> 16); foo (x >> 24); foo (x >> 32); foo (x >> 40); foo (x >> 48); foo (x >> 56); } int a = -8, c, e, f, g, i; short b; static int *d = &c; unsigned h; int main () { if (__CHAR_BIT__ != 8 || __SIZEOF_SHORT__ != 2 || __SIZEOF_INT__ != 4) return 0; for (; g < 256; g++) { h = g; for (i = 8; i; i--) if (h & 1) h = (h >> 1) ^ 3988292384; else h >>= 1; m[g] = h; } b = 53935 & a; a = -18; for (c = 1; c >= 0; c -= 1) { e = 0; for (int j = 0; j <= 3; j++) { short k[1]; if (e) break; e ^= f; } } *d = 8 || 0; bar (a); bar (b); bar (2185655400); bar (c); if (n != 0xbd51857cU) __builtin_abort (); } The only difference between -O3 and -O3 -ftrivial-auto-var-init=zero in gimple dump is the addition of k = .DEFERRED_INIT (2, 2, &"k"[0]); where k is otherwise unused variable.