https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100080
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Richard Biener from comment #1) > Confirmed. At -O2 combine manages to drop the call to foo () (indirectly), > at -O3 it does not. There's not much difference on the GIMPLE level For the gimple level it comes down to: _5 = (unsigned int) l_20(D); if (_5 > 1) goto <bb 5>; [50.00%] else goto <bb 6>; [50.00%] What should we do there, l_20(D) is definitely uninitialized? We even get a warning about it: In function 'e', inlined from 'main' at <source>:17:5: <source>:9:20: warning: 'l' may be used uninitialized [-Wmaybe-uninitialized] 9 | d = c >= (*j = b | *k) && b & (*i == 0); | ~~^~~~ <source>: In function 'main': <source>:16:9: note: 'l' was declared here 16 | int l; | ^