Commit 46dfa8ad by Richard Biener Committed by Richard Biener

re PR tree-optimization/90387 (__builtin_constant_p and -Warray-bounds warnings)

2019-09-11  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/90387
	* vr-values.c (vr_values::extract_range_basic): After inlining
	simplify non-constant __builtin_constant_p to false.

	* gcc.dg/Warray-bounds-44.c: New testcase.

From-SVN: r275639
parent 0a237a94
2019-09-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/90387
* vr-values.c (vr_values::extract_range_basic): After inlining
simplify non-constant __builtin_constant_p to false.
2019-09-11 Eric Botcazou <ebotcazou@adacore.com> 2019-09-11 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/89795 PR rtl-optimization/89795
......
2019-09-11 Richard Biener <rguenther@suse.de>
PR tree-optimization/90387
* gcc.dg/Warray-bounds-44.c: New testcase.
2019-09-11 Eric Botcazou <ebotcazou@adacore.com> 2019-09-11 Eric Botcazou <ebotcazou@adacore.com>
* gcc.target/sparc/20161111-1.c: XFAIL redundant zero-extension test. * gcc.target/sparc/20161111-1.c: XFAIL redundant zero-extension test.
......
/* { dg-do compile } */
/* { dg-options "-O2 -Warray-bounds" } */
int foo(unsigned int state, unsigned char * p, unsigned int p_len)
{
static char const pattern[] = "abcd";
static unsigned const pattern_length = sizeof(pattern) - 1;
if (p_len == 1) {
return state;
}
if (state < pattern_length &&
p_len == (pattern_length - state) &&
(!__builtin_constant_p(p_len) ?
__builtin_memcmp(p, pattern + state, p_len) :
((unsigned char*)p)[6] == ((unsigned char*)pattern + state)[6] /* { dg-bogus "array bounds" } */
)) {
return 4;
}
return 1;
}
...@@ -1124,15 +1124,8 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt) ...@@ -1124,15 +1124,8 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt)
switch (cfn) switch (cfn)
{ {
case CFN_BUILT_IN_CONSTANT_P: case CFN_BUILT_IN_CONSTANT_P:
/* If the call is __builtin_constant_p and the argument is a /* Resolve calls to __builtin_constant_p after inlining. */
function parameter resolve it to false. This avoids bogus if (cfun->after_inlining)
array bound warnings.
??? We could do this as early as inlining is finished. */
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
&& cfun->after_inlining)
{ {
vr->set_zero (type); vr->set_zero (type);
vr->equiv_clear (); vr->equiv_clear ();
......
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