match.pd: optimize unsigned mul overflow check
authorAlexander Monakov <amonakov@ispras.ru>
Mon, 30 May 2016 14:37:02 +0000 (17:37 +0300)
committerAlexander Monakov <amonakov@gcc.gnu.org>
Mon, 30 May 2016 14:37:02 +0000 (17:37 +0300)
gcc/
2016-05-28  Alexander Monakov  <amonakov@ispras.ru>
            Marc Glisse  <marc.glisse@inria.fr>

PR tree-optimization/71289
* match.pd (-1 / B < A, A > -1 / B): New transformations.

gcc/testsuite/
2016-05-28  Alexander Monakov  <amonakov@ispras.ru>

PR tree-optimization/71289
* gcc.dg/pr71289.c: New test.

Co-Authored-By: Marc Glisse <marc.glisse@inria.fr>
From-SVN: r236882

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

index df40818239866ddae0aeaff298c82fc1493b6a0b..80e53bac6a3c249cf69ad9cc46c25e4b4c2d62c2 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-30  Alexander Monakov  <amonakov@ispras.ru>
+           Marc Glisse  <marc.glisse@inria.fr>
+
+       PR tree-optimization/71289
+       * match.pd (-1 / B < A, A > -1 / B): New transformations.
+
 2016-05-30  Jan Hubicka  <hubicka@ucw.cz>
 
        * tree-vect-loop.c (vect_transform_loop): Update likely bounds.
index 8d05e86b7bf5eb0aec5606bbb5e4169aeb4ca440..953c0703d9216d5f1f7826eca65b2758fc4fc048 100644 (file)
@@ -2657,6 +2657,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
    (out (imagpart @2) { build_zero_cst (TREE_TYPE (@0)); }))))
 
+/* For unsigned operands, A > -1 / B checks whether A * B would overflow.
+   Simplify it to __builtin_mul_overflow (A, B, <unused>).  */
+/* -1 / B < A */
+(for cmp (lt ge)
+     out (ne eq)
+ (simplify
+  (cmp (trunc_div:s integer_all_onesp @1) @0)
+  (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
+   (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
+    (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
+
+/* A > -1 / B */
+(for cmp (gt le)
+     out (ne eq)
+ (simplify
+  (cmp @0 (trunc_div:s integer_all_onesp @1))
+  (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && !VECTOR_TYPE_P (TREE_TYPE (@0)))
+   (with { tree t = TREE_TYPE (@0), cpx = build_complex_type (t); }
+    (out (imagpart (IFN_MUL_OVERFLOW:cpx @0 @1)) { build_zero_cst (t); })))))
 
 /* Simplification of math builtins.  These rules must all be optimizations
    as well as IL simplifications.  If there is a possibility that the new
index 9d233f1773ae7b9e526fd17c56f785ca7a454727..ae0a6691cdf1e6a9d707a051b8e91459c99c2f94 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-30  Alexander Monakov  <amonakov@ispras.ru>
+
+       PR tree-optimization/71289
+       * gcc.dg/pr71289.c: New test.
+
 2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        PR middle-end/71269
diff --git a/gcc/testsuite/gcc.dg/pr71289.c b/gcc/testsuite/gcc.dg/pr71289.c
new file mode 100644 (file)
index 0000000..39837b9
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized-raw" } */
+
+int f(unsigned a, unsigned b, unsigned *c)
+{
+  if (a > -1 / b)
+    return -1;
+  *c = a * b;
+  return 0;
+}
+
+void g(unsigned long long a, unsigned long long b, unsigned long long *c)
+{
+  if (a <= -1 / b)
+    *c = a * b;
+}
+
+/* { dg-final { scan-tree-dump-not "trunc_div_expr" "optimized" } } */