aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2017-04-28 22:51:05 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2017-04-28 20:51:05 +0000
commitd35256b6c1c2d52d3539ef8a1c700b69342acd19 (patch)
tree67e432daeec2332a011517d2c89b6f3aae111358
parent0c90d48b346dfd6d41ceebaa58f2dd67c8fc5993 (diff)
downloadgcc-d35256b6c1c2d52d3539ef8a1c700b69342acd19.zip
gcc-d35256b6c1c2d52d3539ef8a1c700b69342acd19.tar.gz
gcc-d35256b6c1c2d52d3539ef8a1c700b69342acd19.tar.bz2
Drop Z from X + Z < Y + Z
2017-04-28 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd (X+Z OP Y+Z, X-Z OP Y-Z, Z-X OP Z-Y): New transformations. gcc/testsuite/ * gcc.dg/tree-ssa/cmpexactdiv-2.c: Update for X-Z OP Y-Z. From-SVN: r247398
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/match.pd48
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c4
4 files changed, 58 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9f885b4..d1204f1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2017-04-28 Marc Glisse <marc.glisse@inria.fr>
+
+ * match.pd (X+Z OP Y+Z, X-Z OP Y-Z, Z-X OP Z-Y): New transformations.
+
2017-04-28 Bernd Edlinger <bernd.edlinger@hotmail.de>
* configure.ac (SYSTEM_HEADER_DIR, BUILD_SYSTEM_HEADER_DIR,
diff --git a/gcc/match.pd b/gcc/match.pd
index 44745df..e3d98ba 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1042,6 +1042,54 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(if (wi::gt_p(@2, 0, TYPE_SIGN (TREE_TYPE (@2))))
(cmp @0 @1))))
+/* X + Z < Y + Z is the same as X < Y when there is no overflow. */
+(for op (lt le ge gt)
+ (simplify
+ (op (plus:c @0 @2) (plus:c @1 @2))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))
+ (op @0 @1))))
+/* For equality and subtraction, this is also true with wrapping overflow. */
+(for op (eq ne minus)
+ (simplify
+ (op (plus:c @0 @2) (plus:c @1 @2))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
+ || TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))))
+ (op @0 @1))))
+
+/* X - Z < Y - Z is the same as X < Y when there is no overflow. */
+(for op (lt le ge gt)
+ (simplify
+ (op (minus @0 @2) (minus @1 @2))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))
+ (op @0 @1))))
+/* For equality and subtraction, this is also true with wrapping overflow. */
+(for op (eq ne minus)
+ (simplify
+ (op (minus @0 @2) (minus @1 @2))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
+ || TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))))
+ (op @0 @1))))
+
+/* Z - X < Z - Y is the same as Y < X when there is no overflow. */
+(for op (lt le ge gt)
+ (simplify
+ (op (minus @2 @0) (minus @2 @1))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))
+ (op @1 @0))))
+/* For equality and subtraction, this is also true with wrapping overflow. */
+(for op (eq ne minus)
+ (simplify
+ (op (minus @2 @0) (minus @2 @1))
+ (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+ && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
+ || TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))))
+ (op @1 @0))))
+
/* ((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 499f780..92db79c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-04-28 Marc Glisse <marc.glisse@inria.fr>
+
+ * gcc.dg/tree-ssa/cmpexactdiv-2.c: Update for X-Z OP Y-Z.
+
2017-04-28 Tom de Vries <tom@codesourcery.com>
* g++.dg/abi/bitfield3.C: Remove superfluous "" in
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c b/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c
index e7f11b9..a41811c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cmpexactdiv-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-optimized-raw" } */
+/* { dg-options "-O -fstrict-overflow -fdump-tree-optimized-raw" } */
int f (long *a, long *b, long *c) {
__PTRDIFF_TYPE__ l1 = b - a;
@@ -7,5 +7,5 @@ int f (long *a, long *b, long *c) {
return l1 < l2;
}
-/* Eventually we also want to remove all minus_expr. */
+/* { dg-final { scan-tree-dump-not "minus_expr" "optimized" } } */
/* { dg-final { scan-tree-dump-not "exact_div_expr" "optimized" } } */