From 46dfa8ad6c18feb45d35734eae38798edb7c38cd Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 11 Sep 2019 11:16:54 +0000 Subject: [PATCH] re PR tree-optimization/90387 (__builtin_constant_p and -Warray-bounds warnings) 2019-09-11 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/Warray-bounds-44.c | 23 +++++++++++++++++++++++ gcc/vr-values.c | 11 ++--------- 4 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Warray-bounds-44.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3452012a45c..21c247b8877 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-09-11 Richard Biener + + 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 PR rtl-optimization/89795 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cd9821e09ff..940be7f8e2f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-09-11 Richard Biener + + PR tree-optimization/90387 + * gcc.dg/Warray-bounds-44.c: New testcase. + 2019-09-11 Eric Botcazou * gcc.target/sparc/20161111-1.c: XFAIL redundant zero-extension test. diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-44.c b/gcc/testsuite/gcc.dg/Warray-bounds-44.c new file mode 100644 index 00000000000..709d0046b8c --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-44.c @@ -0,0 +1,23 @@ +/* { 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; +} diff --git a/gcc/vr-values.c b/gcc/vr-values.c index 256cae73ebb..0ebb6e3bbd4 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -1124,15 +1124,8 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt) switch (cfn) { case CFN_BUILT_IN_CONSTANT_P: - /* 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. */ - 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) + /* Resolve calls to __builtin_constant_p after inlining. */ + if (cfun->after_inlining) { vr->set_zero (type); vr->equiv_clear (); -- 2.30.2