aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2005-05-02 18:06:27 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2005-05-02 18:06:27 +0000
commitfda05890956b883a25ea35edfa65db76a50c3da3 (patch)
tree007185f8315d22ba9507e23cada2994174208884
parentcbbf94032814561e9fbc7a5330b73d77bbcaa8ed (diff)
downloadgcc-fda05890956b883a25ea35edfa65db76a50c3da3.zip
gcc-fda05890956b883a25ea35edfa65db76a50c3da3.tar.gz
gcc-fda05890956b883a25ea35edfa65db76a50c3da3.tar.bz2
re PR tree-optimization/21294 (Missed removal of null pointer check)
gcc/ PR tree-optimization/21294 * tree-vrp.c (vrp_expr_computes_nonzero): New. (extract_range_from_expr): Call vrp_expr_computes_nonzero. testsuite/ PR tree-optimization/21294 * gcc.dg/tree-ssa/pr21294.c: New. From-SVN: r99111
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21294.c23
-rw-r--r--gcc/tree-vrp.c31
4 files changed, 64 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d3d7f07..20bf784 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-05-02 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21294
+ * tree-vrp.c (vrp_expr_computes_nonzero): New.
+ (extract_range_from_expr): Call vrp_expr_computes_nonzero.
+
2005-05-02 Janis Johnson <janis187@us.ibm.com>
PR 19985
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7c5caab..46c9e1d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-02 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21294
+ * gcc.dg/tree-ssa/pr21294.c: New.
+
2005-05-02 Paolo Bonzini <bonzini@gnu.org>
* gcc.dg/altivec-3.c (vec_store): Do not use the old
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
new file mode 100644
index 0000000..dc90dbd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
@@ -0,0 +1,23 @@
+/* PR tree-optimization/21294
+ VRP did not notice that an address of the form &p->i is nonnull
+ when p is known to be nonnull. In this testcase, noticing that
+ allows us to eliminate the second "if" statement. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp-details" } */
+
+struct f {
+ int i;
+};
+
+int
+foo (struct f *p)
+{
+ if (p != 0)
+ if (&p->i != 0)
+ return 123;
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp"} } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 0fe5c7b..e6cb017 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -717,6 +717,35 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
}
+/* Like expr_computes_nonzero, but this function uses value ranges
+ obtained so far. */
+
+static bool
+vrp_expr_computes_nonzero (tree expr)
+{
+ if (expr_computes_nonzero (expr))
+ return true;
+
+ /* If we have an expression of the form &X->a, then the expression
+ is nonnull if X is nonnull. */
+ if (TREE_CODE (expr) == ADDR_EXPR)
+ {
+ tree base = get_base_address (TREE_OPERAND (expr, 0));
+
+ if (base != NULL_TREE
+ && TREE_CODE (base) == INDIRECT_REF
+ && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
+ {
+ value_range *vr = get_value_range (TREE_OPERAND (base, 0));
+ if (range_is_nonnull (vr))
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
/* Extract range information from a unary expression EXPR based on
the range of its operand and the expression code. */
@@ -833,7 +862,7 @@ extract_range_from_expr (value_range *vr, tree expr)
extract_range_from_binary_expr (vr, expr);
else if (TREE_CODE_CLASS (code) == tcc_unary)
extract_range_from_unary_expr (vr, expr);
- else if (expr_computes_nonzero (expr))
+ else if (vrp_expr_computes_nonzero (expr))
set_value_range_to_nonnull (vr, TREE_TYPE (expr));
else if (TREE_CODE (expr) == INTEGER_CST)
set_value_range (vr, VR_RANGE, expr, expr);