https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117095
--- Comment #1 from Stefan Schulze Frielinghaus <stefansf at gcc dot gnu.org> --- For the outcome basically only b = fn3(q == &l); *h = b; if (c != 1) __builtin_abort(); matters. The optimized tree output for that part looks good to me (using -O2 of course): a.1_34 = a; a.2_35 = (unsigned short) a.1_34; _36 = 1 - a.2_35; _37 = (short int) _36; b = _37; h.13_15 = h; _16 = (int) _37; *h.13_15 = _16; c.14_17 = c; if (c.14_17 != 1) goto <bb 10>; [0.00%] else goto <bb 11>; [100.00%] <bb 10> [count: 0]: __builtin_abort (); <bb 11> [local count: 14598063]: return 0;