re PR middle-end/77407 (Optimize integer i / abs (i) into the sign of i)
authorRichard Biener <rguenther@suse.de>
Thu, 29 Sep 2016 12:28:19 +0000 (12:28 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 29 Sep 2016 12:28:19 +0000 (12:28 +0000)
2016-09-29  Richard Biener  <rguenther@suse.de>

PR middle-end/77407
* match.pd: Add X / abs (X) -> X < 0 ? -1 : 1 and
X / -X -> -1 simplifications.

* gcc.dg/pr77407.c: New testcase.

From-SVN: r240616

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr77407.c [new file with mode: 0644]

index 5ebd880f444c7d47b3ab06ea4d86a2a1c43192b9..6b832ed26d01224216e739c47f76e668a27ab647 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-29  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77407
+       * match.pd: Add X / abs (X) -> X < 0 ? -1 : 1 and
+       X / -X -> -1 simplifications.
+
 2016-09-29  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/55152
index 553e50d2d03b4f05c599cd37383e25c4f613a6b1..ba7e0132e31c109bfaad6d19f1a33614e38dbb0b 100644 (file)
@@ -147,12 +147,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
     (op @0 integer_onep)
     (non_lvalue @0)))
 
-/* X / -1 is -X.  */
 (for div (trunc_div ceil_div floor_div round_div exact_div)
+  /* X / -1 is -X.  */
  (simplify
    (div @0 integer_minus_onep@1)
    (if (!TYPE_UNSIGNED (type))
-    (negate @0))))
+    (negate @0)))
+ /* X / abs (X) is X < 0 ? -1 : 1.  */ 
+ (simplify
+   (div @0 (abs @0))
+   (if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
+       && TYPE_OVERFLOW_UNDEFINED (type))
+    (cond (lt @0 { build_zero_cst (type); })
+          { build_minus_one_cst (type); } { build_one_cst (type); })))
+ /* X / -X is -1.  */
+ (simplify
+   (div @0 (negate @0))
+   (if ((INTEGRAL_TYPE_P (type) || VECTOR_INTEGER_TYPE_P (type))
+       && TYPE_OVERFLOW_UNDEFINED (type))
+    { build_minus_one_cst (type); })))
 
 /* For unsigned integral types, FLOOR_DIV_EXPR is the same as
    TRUNC_DIV_EXPR.  Rewrite into the latter in this case.  */
index a88a975d6a026890bcc1301965a5ffa938bbb6dd..9269d58bb187182a8505b90defc87ecdd625860a 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-28  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77407
+       * gcc.dg/pr77407.c: New testcase.
+
 2016-09-29  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/55152
diff --git a/gcc/testsuite/gcc.dg/pr77407.c b/gcc/testsuite/gcc.dg/pr77407.c
new file mode 100644 (file)
index 0000000..8cad857
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fstrict-overflow -fdump-tree-gimple" } */
+
+int foo (int c)
+{
+  if (c != 0)
+    c /= __builtin_abs (c);
+  return c;
+}
+
+int bar (int c)
+{
+  if (c != 0)
+    c /= -c;
+  return c;
+}
+
+/* { dg-final { scan-tree-dump-times "/" 0 "gimple" } } */