https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110228
--- Comment #32 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- (In reply to Richard Biener from comment #29) > I can't reproduce the original failure on trunk or with GCC 13.1, but the > testcase from comment#16 is now fixed. I also cannot reproduce the testcase > from comment#21 before the fix. > > Can people double-check this is now fixed, maybe also on the branch when this > fix is cherry-picked? Test suite on llvm-16 still fails the same single 'LLVM :: ExecutionEngine/JITLink/X86/MachO_weak_references.s' test for me. gcc was built from 2c12ccf800fc7890925402d30a02f0fa9e2627cc. The following test still fails for me: $ cat bug.c static unsigned a[4] = {1,1,1,1}; __attribute__((noipa)) static void bug(unsigned * p, unsigned *t, int n) { unsigned LookupFlags; for(int i = 0; i < n; i++) { unsigned v = t[i]; if (v == 0) LookupFlags = 0; else if (v == 1) LookupFlags = 1; *p = LookupFlags; } } int main() { unsigned r = 42; bug(&r, a, 4); if (r != 1) __builtin_abort(); return 0; } $ gcc bug.c -o bug -O1 -Wall && ./bug bug.c: In function 'bug': bug.c:10:15: warning: 'LookupFlags' may be used uninitialized [-Wmaybe-uninitialized] 10 | else if (v == 1) LookupFlags = 1; | ^ bug.c:5:15: note: 'LookupFlags' was declared here 5 | unsigned LookupFlags; | ^~~~~~~~~~~ Aborted (core dumped) bug.c.255t.optimized still turns stores into '|=' against uninit value: __attribute__((noipa, noinline, noclone, no_icf)) void bug (unsigned int * p, unsigned int * t, int n) { unsigned long ivtmp.8; unsigned int v; unsigned int LookupFlags; _Bool _16; unsigned int _17; unsigned int _18; void * _19; unsigned long _20; unsigned long _26; unsigned long _28; <bb 2> [local count: 118111600]: if (n_10(D) > 0) goto <bb 3>; [89.00%] else goto <bb 7>; [11.00%] <bb 3> [local count: 105119324]: ivtmp.8_21 = (unsigned long) t_11(D); _20 = (unsigned long) n_10(D); _26 = _20 * 4; _28 = ivtmp.8_21 + _26; <bb 4> [local count: 955630225]: # LookupFlags_22 = PHI <LookupFlags_4(6), LookupFlags_8(D)(3)> # ivtmp.8_6 = PHI <ivtmp.8_5(6), ivtmp.8_21(3)> _19 = (void *) ivtmp.8_6; v_12 = MEM[(unsigned int *)_19]; if (v_12 == 0) goto <bb 6>; [50.00%] else goto <bb 5>; [50.00%] <bb 5> [local count: 477815112]: _16 = v_12 == 1; _17 = (unsigned int) _16; _18 = _17 | LookupFlags_22; <bb 6> [local count: 955630225]: # LookupFlags_4 = PHI <v_12(4), _18(5)> *p_13(D) = LookupFlags_4; ivtmp.8_5 = ivtmp.8_6 + 4; if (ivtmp.8_5 != _28) goto <bb 4>; [89.00%] else goto <bb 7>; [11.00%] <bb 7> [local count: 118111600]: return; }