X /[ex] 4 < Y /[ex] 4
authorMarc Glisse <marc.glisse@inria.fr>
Mon, 24 Apr 2017 19:04:25 +0000 (21:04 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Mon, 24 Apr 2017 19:04:25 +0000 (19:04 +0000)
2017-04-24  Marc Glisse  <marc.glisse@inria.fr>

gcc/
* match.pd (X/[ex]C CMP Y/[ex]C): New transformation.

gcc/testsuite/
* gcc.dg/tree-ssa/cmpexactdiv-2.c: New file.

From-SVN: r247107

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c [new file with mode: 0644]

index 0dd86c12e6c8950eec900fb219f1763632565eaa..c11863263347c5944ebc60089e97b71d6ef59367 100644 (file)
@@ -1,3 +1,7 @@
+2017-04-24  Marc Glisse  <marc.glisse@inria.fr>
+
+       * match.pd (X/[ex]C CMP Y/[ex]C): New transformation.
+
 2017-04-24  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/80293
index 357797877c868bd3985ab5f2e283a3431a5337a7..44745df9afa546d5380c99d1ec276deb8babe915 100644 (file)
@@ -1035,6 +1035,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && wi::neg_p (@1, TYPE_SIGN (TREE_TYPE (@1))))
     (cmp @2 @0))))))
 
+/* X / 4 < Y / 4 iff X < Y when the division is known to be exact.  */
+(for cmp (simple_comparison)
+ (simplify
+  (cmp (exact_div @0 INTEGER_CST@2) (exact_div @1 @2))
+  (if (wi::gt_p(@2, 0, TYPE_SIGN (TREE_TYPE (@2))))
+   (cmp @0 @1))))
+
 /* ((X inner_op C0) outer_op C1)
    With X being a tree where value_range has reasoned certain bits to always be
    zero throughout its computed value range,
index 3be6903c7e961ef1f9f1fbfe94ab05e141b9d814..c8d79e3663a02dea97574a69b16c428b511560eb 100644 (file)
@@ -1,3 +1,7 @@
+2017-04-24  Marc Glisse  <marc.glisse@inria.fr>
+
+       * gcc.dg/tree-ssa/cmpexactdiv-2.c: New file.
+
 2017-04-24  Volker Reichelt  <v.reichelt@netcologne.de>
 
        * g++.dg/diagnostic/duplicate1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c b/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c
new file mode 100644 (file)
index 0000000..e7f11b9
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized-raw" } */
+
+int f (long *a, long *b, long *c) {
+    __PTRDIFF_TYPE__ l1 = b - a;
+    __PTRDIFF_TYPE__ l2 = c - a;
+    return l1 < l2;
+}
+
+/* Eventually we also want to remove all minus_expr.  */
+/* { dg-final { scan-tree-dump-not "exact_div_expr" "optimized" } } */