https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78228
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2016-11-07 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- No, it is phiopt1 that introduces ABS, but disabling VRP fixes it so I guess some bogus range info is around. <bb 2>: _4 = i_3(D) < 0; width_5 = (unsigned int) _4; - if (i_3(D) > 0) + _19 = ABS_EXPR <i_3(D)>; + i_18 = -_19; + if (i_18 < -999999999) from: <bb 2>: # RANGE [0, 1] _4 = i_3(D) < 0; # RANGE [0, 1] NONZERO 1 width_5 = (unsigned int) _4; if (i_3(D) > 0) goto <bb 3>; else goto <bb 4>; <bb 3>: # RANGE [-2147483647, -1] i_6 = -i_3(D); <bb 4>: # RANGE [-2147483648, 0] # i_1 = PHI <i_3(D)(2), i_6(3)> which IMHO looks ok. Looks like a abs_replacement bug where it creates a negate w/o proper checking.