https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107704
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- So here is the reason why it regressed: Before the patch, ce1 is able to find the ifcvt. After the patch, gcc is not to find the ifcvt until ce2. Since ce2 happens after combine. Nothing "combines": (insn 41 40 145 7 (set (reg:SI 147 t) (ge:SI (reg:SI 164 [ _8 ]) (reg:SI 166 [ _13 ]))) "/app/example.cpp":44:10 discrim 1 14 {cmpgesi_t} (expr_list:REG_DEAD (reg:SI 166 [ _13 ]) (expr_list:REG_DEAD (reg:SI 164 [ _8 ]) (nil)))) (insn 145 41 146 7 (set (reg:SI 190) (reg:SI 147 t)) "/app/example.cpp":43:16 288 {movt} (nil)) (insn 146 145 147 7 (set (reg:SI 191) (neg:SI (reg:SI 190))) "/app/example.cpp":43:16 152 {negsi2} (nil)) Into: (set (reg:SI 195) (neg:SI (ge:SI (reg:SI 164 [ _8 ]) (reg:SI 166 [ _15 ])))) or (insn 177 175 178 (parallel [ (set (reg:SI 1 r1 [189]) (neg:SI (reg:SI 147 t))) (clobber (reg:SI 147 t)) ]) "/app/example.cpp":43:16 296 {mov_neg_si_t} (expr_list:REG_DEAD (reg:SI 147 t) (expr_list:REG_UNUSED (reg:SI 147 t) (nil)))) Like it was done before the patch. Now on the trunk late_combine2 might be able to do it but I have not checked. late_combine happens before pass_if_after_combine too; though I wonder if it should happen afterwards ...