From e57f2b4144b1346f1461faaf0d610699e794a8f2 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Thu, 23 Jun 2005 16:04:09 +0000 Subject: [PATCH] re PR tree-optimization/22117 (VRP thinks + is always nonnull.) gcc/ PR tree-optimization/22117 * tree-vrp.c (extract_range_from_binary_expr): Compute a correct range when adding two pointers. testsuite/ PR tree-optimization/22117 * gcc.dg/tree-ssa/pr22117.c: New. From-SVN: r101272 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr22117.c | 23 +++++++++++++++++++++++ gcc/tree-vrp.c | 9 ++++++++- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr22117.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7aaa16..cbf721b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-23 Kazu Hirata + + PR tree-optimization/22117 + * tree-vrp.c (extract_range_from_binary_expr): Compute a + correct range when adding two pointers. + 2005-06-23 Jason Merrill PR c++/19317 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c421cb..6250859 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-23 Kazu Hirata + + PR tree-optimization/22117 + * gcc.dg/tree-ssa/pr22117.c: New. + 2005-06-23 James A. Morrison PR testsuite/22123 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr22117.c b/gcc/testsuite/gcc.dg/tree-ssa/pr22117.c new file mode 100644 index 0000000..0955c45 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr22117.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/22117 + VRP used think that &p[q] is nonzero even though p and q are both + known to be zero after entering the first two "if" statements. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp" } */ + +void +foo (int *p, int q) +{ + if (p == 0) + { + if (q == 0) + { + int *r = &p[q]; + if (r != 0) + link_error (); + } + } +} + +/* { dg-final { scan-tree-dump-times "Folding predicate r_.* != 0B to 0" 1 "vrp" } } */ +/* { dg-final { cleanup-tree-dump "vrp" } } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 81b0c0a..284208b 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1073,7 +1073,14 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr) ivopts is generating expressions with pointer multiplication in them. */ if (code == PLUS_EXPR) - set_value_range_to_nonnull (vr, TREE_TYPE (expr)); + { + if (range_is_nonnull (&vr0) || range_is_nonnull (&vr1)) + set_value_range_to_nonnull (vr, TREE_TYPE (expr)); + else if (range_is_null (&vr0) && range_is_null (&vr1)) + set_value_range_to_null (vr, TREE_TYPE (expr)); + else + set_value_range_to_varying (vr); + } else { /* Subtracting from a pointer, may yield 0, so just drop the -- 2.7.4