https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94893
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #4) > (In reply to Andrew Pinski from comment #3) > > Note we also don't optimize: > > > > inline int sign1(int x) > > { > > return (x < 0 ? -1 : 0) | (x > 0 ? 1 : 0); > > } > > bool f1(int x) > > { > > return sign1(x) < 1; > > } > > > > To be just `x <= 0` > > That is because forwprop leaves assignments that are not used anywhere still. > after dce7: > ``` > if (x_2(D) < 0) > goto <bb 4>; [41.00%] > else > goto <bb 3>; [59.00%] > > <bb 3> [local count: 633507680]: > _7 = x_2(D) != 0; > _8 = (int) _7; > _5 = _8 ^ 1; > _10 = (bool) _5; > > <bb 4> [local count: 1073741824]: > # prephitmp_11 = PHI <1(2), _10(3)> > ``` > After frowprop4: > ``` > if (x_2(D) < 0) > goto <bb 4>; [41.00%] > else > goto <bb 3>; [59.00%] > > <bb 3> [local count: 633507680]: > _7 = x_2(D) != 0; > _8 = (int) _7; > _3 = x_2(D) == 0; > _5 = (int) _3; > > <bb 4> [local count: 1073741824]: > # prephitmp_11 = PHI <1(2), _3(3)> > ``` > > If those statements were removed then phiopt4 would be able to optimize > prephitmp_11 to: `(x_2(D) < 0) | (x_2(D) == 0)` which simplifies to `x_2(D) > <= 0` . > > Let me look into the forwprop issue here. That was fixed with r14-3982-g9ea74d235c7e78 .