On 32-bit HWI host calling simplify_binary_operation (MINUS, DImode, (reg/v:DI 60 [ x ]), (const_int -2147483648 [0x80000000])) returns (plus:DI (reg/v:DI 60 [ x ]) (const_int -2147483648 [0x80000000])) which is wrong. I guess we need to avoid the INTVAL wrap in that case. 2041 /* Don't let a relocatable value get a negative coeff. */ 2042 if (CONST_INT_P (op1) && GET_MODE (op0) != VOIDmode) 2043 return simplify_gen_binary (PLUS, mode, 2044 op0, 2045 neg_const_int (mode, op1)); and: 66/* Negate a CONST_INT rtx, truncating (because a conversion from a 67 maximally negative number can overflow). */ 68static rtx 69neg_const_int (enum machine_mode mode, const_rtx i) 70{ 71 return gen_int_mode (- INTVAL (i), mode); 72} if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT), I guess we want to avoid this "optimization" if op1 != const0_rtx && (unsigned HOST_WIDE_INT) INTVAL (op1) == -(unsigned HOST_WIDE_INT) INTVAL (op1). Also, I wonder if neg_const_int we don't need to use - (unsigned HOST_WIDE_INT) INTVAL (i), as otherwise we e.g. for -ftrapv built gcc we could trap.
-- Summary: simplify_binary_operation_1 MINUS x const_int issue Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43226