aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-11-27 09:45:04 +0100
committerRichard Biener <rguenther@suse.de>2023-11-27 10:39:59 +0100
commitd9abaa8d58f5729925b1db735d4723a9ea825eaa (patch)
tree71b234d03d55523445b341508e2104ac564e1793 /gcc
parent8e4db85eca7c6e9461b8026052f6c8545c31341c (diff)
downloadgcc-d9abaa8d58f5729925b1db735d4723a9ea825eaa.zip
gcc-d9abaa8d58f5729925b1db735d4723a9ea825eaa.tar.gz
gcc-d9abaa8d58f5729925b1db735d4723a9ea825eaa.tar.bz2
tree-optimization/112706 - missed simplification of condition
We lack a match.pd pattern recognizing ptr + o ==/!= ptr + o'. The following extends handling we have for integral types to pointers. PR tree-optimization/112706 * match.pd (ptr + o ==/!=/- ptr + o'): New patterns. * gcc.dg/tree-ssa/pr112706.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd9
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr112706.c15
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 61e5d34..95225e4 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2596,6 +2596,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
|| TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))))
(op @0 @1))))
+/* And similar for pointers. */
+(for op (eq ne)
+ (simplify
+ (op (pointer_plus @0 @1) (pointer_plus @0 @2))
+ (op @1 @2)))
+(simplify
+ (pointer_diff (pointer_plus @0 @1) (pointer_plus @0 @2))
+ (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@1)))
+ (convert (minus @1 @2))))
/* X - Z < Y - Z is the same as X < Y when there is no overflow. */
(for op (lt le ge gt)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr112706.c b/gcc/testsuite/gcc.dg/tree-ssa/pr112706.c
new file mode 100644
index 0000000..217730b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr112706.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre1" } */
+
+int *ptr;
+void link_error ();
+void
+test ()
+{
+ int *ptr1 = ptr + 10;
+ int *ptr2 = ptr + 20;
+ if (ptr1 == ptr2)
+ link_error ();
+}
+
+/* { dg-final { scan-tree-dump-not "if" "fre1" } } */