Commit c7ab2530 by Richard Guenther Committed by Richard Biener

re PR tree-optimization/44061 (Warns about out-of-bounds array access inside…

re PR tree-optimization/44061 (Warns about out-of-bounds array access inside __builtin_constant_p guarded section)

2012-01-11  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/44061
	* tree-vrp.c (extract_range_basic): Compute zero as
	value-range for __builtin_constant_p of function parameters.

	* gcc.dg/pr44061.c: New testcase.

From-SVN: r195103
parent 8549adbd
2012-01-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44061
* tree-vrp.c (extract_range_basic): Compute zero as
value-range for __builtin_constant_p of function parameters.
2013-01-10 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years
......
2012-01-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44061
* gcc.dg/pr44061.c: New testcase.
2013-01-10 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years
......
/* { dg-do compile } */
/* { dg-options "-O2 -Wall" } */
int a[2];
int foo (int q)
{
if (__builtin_constant_p (q))
{
if (q == 4)
return a[4]; /* { dg-bogus "array subscript is above array bounds" } */
else
return a[0];
}
else
return a[q];
}
......@@ -3565,8 +3565,20 @@ extract_range_basic (value_range_t *vr, gimple stmt)
bool sop = false;
tree type = gimple_expr_type (stmt);
if (INTEGRAL_TYPE_P (type)
&& gimple_stmt_nonnegative_warnv_p (stmt, &sop))
/* If the call is __builtin_constant_p and the argument is a
function parameter resolve it to false. This avoids bogus
array bound warnings.
??? We could do this as early as inlining is finished. */
if (gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P))
{
tree arg = gimple_call_arg (stmt, 0);
if (TREE_CODE (arg) == SSA_NAME
&& SSA_NAME_IS_DEFAULT_DEF (arg)
&& TREE_CODE (SSA_NAME_VAR (arg)) == PARM_DECL)
set_value_range_to_null (vr, type);
}
else if (INTEGRAL_TYPE_P (type)
&& gimple_stmt_nonnegative_warnv_p (stmt, &sop))
set_value_range_to_nonnegative (vr, type,
sop || stmt_overflow_infinity (stmt));
else if (vrp_stmt_computes_nonzero (stmt, &sop)
......
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