https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58195
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #8) > Note the loop one looks like: > if (input_4(D) != 0) > goto <bb 3>; [89.00%] > else > goto <bb 4>; [11.00%] > > <bb 3> [local count: 105119324]: > _1 = (unsigned int) input_4(D); > _3 = -_1; > value_2 = (int) _3; > > <bb 4> [local count: 118111600]: > # value_10 = PHI <value_2(3), 0(2)> > > ---- CUT ---- > Which avoids undefined overflow for INT_MIN. After r14-4889-g0fc13e8c0e39c5 in phiopt we have: ``` <bb 2> [local count: 118111600]: if (input_3(D) != 0) goto <bb 3>; [89.00%] else goto <bb 4>; [11.00%] <bb 3> [local count: 105119324]: _1 = (unsigned int) input_3(D); _7 = -_1; <bb 4> [local count: 118111600]: # _11 = PHI <_7(3), 0(2)> ``` There are 2 ways of handling this. First is to handle the TODO in factor_out_conditional_operation: /* TODO: handle more than just casts here. */ Which help others. So I think I am going to implement that way. Once we handle that we will end up with `input_3 != 0 ? input_3 : 0` which then will then reduce down to just input_3. So the operations that should be simple to handle are NEGATIVE_EXPR, ABS_EXPR and ABSU_EXPR. If we only handle those for 0, it should be the safest form. And could be expanded later on for other values.