https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79059
--- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> --- I can't remember if this is the same but I don't know how to describe this optimization right now but take the following two functions: struct arc { int ident; }; int bea_is_dual_infeasible( struct arc *arc, int red_cost ) { return( (red_cost < 0 && arc->ident == 1) || (red_cost > 0 && arc->ident == 2) ); } int bea_is_dual_infeasible1( struct arc *arc, int red_cost ) { int t; if (red_cost == 0) return 0; return arc->ident == ((red_cost > 0) ? 2 : 1); } They both do the same thing but bea_is_dual_infeasible1 has only one branch (no conditional move either) while bea_is_dual_infeasible has many branches. This is true on x86 (have not checked arm though).