https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95410
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |NEW Last reconfirmed| |2021-04-21 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed. We have: if (x.0_1 >= y.1_2) goto <bb 4>; [34.00%] else goto <bb 3>; [66.00%] <bb 3> [local count: 708669601]: _10 = ~x_5(D); _7 = (bool) _10; <bb 4> [local count: 1073741824]: # _4 = PHI <0(2), _7(3)> Which obvious can be converted to: _10 = ~x_5(D); _7 = (bool) _t = x.0_1 >= y.1_2 _t1 = ~_t _4 = _t1 & _7 ---- CUT ---- I notice the other two don't produce the same tree level either (but the same assembly code in the end): _1 = ~x_7(D); _4 = x.2_2 < y.3_3; _5 = (int) _4; _6 = _1 & _5; _9 = (bool) _6; ------------------------ _3 = x.4_1 < y.5_2; _11 = ~x_7(D); _5 = (bool) _11; _6 = _3 & _5; ------------------------------- That is it does not convert: _5 = (int) _4; _6 = _1 & _5; _9 = (bool) _6; Into: _t = (bool) _1; _6 = _t & _4;