Commit fda05890 by Kazu Hirata Committed by Kazu Hirata

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
parent cbbf9403
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> 2005-05-02 Janis Johnson <janis187@us.ibm.com>
PR 19985 PR 19985
......
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> 2005-05-02 Paolo Bonzini <bonzini@gnu.org>
* gcc.dg/altivec-3.c (vec_store): Do not use the old * gcc.dg/altivec-3.c (vec_store): Do not use the old
......
/* 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" } } */
...@@ -717,6 +717,35 @@ extract_range_from_binary_expr (value_range *vr, tree expr) ...@@ -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 /* Extract range information from a unary expression EXPR based on
the range of its operand and the expression code. */ the range of its operand and the expression code. */
...@@ -833,7 +862,7 @@ extract_range_from_expr (value_range *vr, tree expr) ...@@ -833,7 +862,7 @@ extract_range_from_expr (value_range *vr, tree expr)
extract_range_from_binary_expr (vr, expr); extract_range_from_binary_expr (vr, expr);
else if (TREE_CODE_CLASS (code) == tcc_unary) else if (TREE_CODE_CLASS (code) == tcc_unary)
extract_range_from_unary_expr (vr, expr); 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)); set_value_range_to_nonnull (vr, TREE_TYPE (expr));
else if (TREE_CODE (expr) == INTEGER_CST) else if (TREE_CODE (expr) == INTEGER_CST)
set_value_range (vr, VR_RANGE, expr, expr); set_value_range (vr, VR_RANGE, expr, expr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment