https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112542
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2023-11-15 Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ``` _7 = (char) c.2_5; ... _26 = _7 == 0; _27 = c.2_5 == 0; _28 = _26 & _27; if (_28 != 0) ``` we transform this into: ``` _26 = _7 == 0; _27 = c.2_5 == 0; if (c.2_5 == 0) ``` During FRE1 Which is correct. and _26 goes away later on. Then in evpr GCC changes: ``` # iftmp.8_29 = PHI <_7(4), 0(5)> ``` into: ``` # iftmp.8_29 = PHI <-1(4), 0(5)> ``` Which is also correct. Where it goes wrong is vrp1. We end up with this mess: ``` b.0_1 = b; _2 = b.0_1 == 0; _4 = (int) _2; c = _4; i.7_12 = (unsigned int) _2; _16 = b.0_1 != 0; _15 = _16 ? 1 : 2; if (_15 == 2) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_unreachable (); ``` But that is basically: ``` ... if (b.0_1 == 0) __builtin_unreachable(); ```