https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77407

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-08-30
                 CC|                            |rguenth at gcc dot gnu.org
     Ever confirmed|0                           |1
           Severity|normal                      |enhancement

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Full testcase(?)

int foo (int c)
{
  if (c != 0)
    c /= __builtin_abs (c);
  return c;
}

Possible "fix":

(simplify
 (trunc_div @0 (abs @0))
 (if (! TYPE_UNSIGNED (type)
      && TYPE_OVERFLOW_UNDEFINED (type))
  (cond (lt @0 { build_zero_cst (type); }) { build_minus_one_cst (type); } {
build_one_cst (type); })))

but eventually we should simply make __builtin_copysign also work on
integers...

Not sure if desirable also for _Complex int and vector int (both handled
above).

Need to double-check for non-truncating divisions.

Similar testcase would be

  if (c != 0)
    c /= -c;

Reply via email to