diff options
author | Richard Biener <rguenther@suse.de> | 2023-11-27 09:45:04 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-11-27 10:39:59 +0100 |
commit | d9abaa8d58f5729925b1db735d4723a9ea825eaa (patch) | |
tree | 71b234d03d55523445b341508e2104ac564e1793 /gcc | |
parent | 8e4db85eca7c6e9461b8026052f6c8545c31341c (diff) | |
download | gcc-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.pd | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr112706.c | 15 |
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" } } */ |