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
This commit is contained in:
Richard Guenther 2013-01-11 10:20:02 +00:00 committed by Richard Biener
parent 8549adbd32
commit c7ab25306d
4 changed files with 41 additions and 2 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,16 @@
/* { 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];
}

View File

@ -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)