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:
parent
8549adbd32
commit
c7ab25306d
@ -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
|
||||
|
@ -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
|
||||
|
16
gcc/testsuite/gcc.dg/pr44061.c
Normal file
16
gcc/testsuite/gcc.dg/pr44061.c
Normal 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];
|
||||
}
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user