https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110252
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2023-06-14 Component|c |tree-optimization Status|UNCONFIRMED |ASSIGNED Summary|Wrong code at -O2/3/s on |[14 Regression] Wrong code |x86_64-linux-gnu |at -O2/3/s on | |x86_64-linux-gnu Target Milestone|--- |14.0 Keywords| |wrong-code Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So phiopt does this: phiopt match-simplify trying: _4 >= 0 ? iftmp.0_16 : 1 Matching expression match.pd:1990, gimple-match-5.cc:23 Matching expression match.pd:1990, gimple-match-5.cc:23 Applying pattern match.pd:5283, gimple-match-2.cc:942 Applying pattern match.pd:1378, gimple-match-2.cc:7699 Applying pattern match.pd:1885, gimple-match-3.cc:2770 Applying pattern match.pd:4745, gimple-match-7.cc:15371 Folded into the sequence: _22 = _4 >= 0; _21 = (int) _22; _23 = _4 < 0; _24 = (int) _23; _25 = iftmp.0_16 | _24; statement un-sinked: iftmp.0_16 = _4 >> 6; The problem is `_4 >> 6` only has a [0,1] range iff `_4 < 0`. I have to think of a way of fixing this without too much trouble. Maybe reverting the patch might be the best for now. But there could be other issues dealing with phiopt and match-and-simplify later on for a similar reasons ...