re PR tree-optimization/90387 (__builtin_constant_p and -Warray-bounds warnings)
authorRichard Biener <rguenther@suse.de>
Wed, 11 Sep 2019 11:16:54 +0000 (11:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 11 Sep 2019 11:16:54 +0000 (11:16 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Warray-bounds-44.c [new file with mode: 0644]
gcc/vr-values.c

index 3452012a45c6f4d5f416658f1246932775eba007..21c247b88779815d2ad8bb9413a13529f41e2568 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR rtl-optimization/89795
index cd9821e09ff0213298f2281b5f799201bc24b9d9..940be7f8e2f83d886825d4fe40d8d224ab30f1a0 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * 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 (file)
index 0000000..709d004
--- /dev/null
@@ -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;
+}
index 256cae73ebb88abf9b0bd00fe355405185cac627..0ebb6e3bbd42964f127e173dd4ea8bdb380e0577 100644 (file)
@@ -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 ();