From d9abaa8d58f5729925b1db735d4723a9ea825eaa Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 27 Nov 2023 09:45:04 +0100 Subject: [PATCH] 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. --- gcc/match.pd | 9 +++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr112706.c | 15 +++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr112706.c diff --git a/gcc/match.pd b/gcc/match.pd index 61e5d3441f4..95225e4ca5f 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 00000000000..217730b99b2 --- /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" } } */ -- 2.11.4.GIT