HOST_WIDE_INT d = INTVAL (op1);
unsigned HOST_WIDE_INT abs_d;
- abs_d = d >= 0 ? d : - (unsigned HOST_WIDE_INT) d;
+ /* Since d might be INT_MIN, we have to cast to
+ unsigned HOST_WIDE_INT before negating to avoid
+ undefined signed overflow. */
+ abs_d = (d >= 0
+ ? (unsigned HOST_WIDE_INT) d
+ : - (unsigned HOST_WIDE_INT) d);
/* n rem d = n rem -d */
if (rem_flag && d < 0)