aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2017-04-24 21:04:25 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2017-04-24 19:04:25 +0000
commita8492d5ec1d8b90930a7dca04a104bcaec62d035 (patch)
tree93650497930101fed7cb82fd859815c074e3cda8 /gcc
parentec856f5f8b372d1201ec204876ed078a1c0f1f37 (diff)
downloadgcc-a8492d5ec1d8b90930a7dca04a104bcaec62d035.zip
gcc-a8492d5ec1d8b90930a7dca04a104bcaec62d035.tar.gz
gcc-a8492d5ec1d8b90930a7dca04a104bcaec62d035.tar.bz2
X /[ex] 4 < Y /[ex] 4
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/match.pd7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c11
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0dd86c1..c118632 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/match.pd b/gcc/match.pd
index 3577978..44745df 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -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,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3be6903..c8d79e3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..e7f11b9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c
@@ -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" } } */