re PR tree-optimization/56273 (Bogus -Warray-bounds warning)
authorRichard Biener <rguenther@suse.de>
Mon, 11 Feb 2013 13:33:19 +0000 (13:33 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 11 Feb 2013 13:33:19 +0000 (13:33 +0000)
2013-02-11  Richard Biener  <rguenther@suse.de>

PR tree-optimization/56273
* tree-vrp.c (simplify_cond_using_ranges): Disable for the
first VRP run.
(check_array_ref): Fix missing newline in dumps.
(search_for_addr_array): Likewise.

* g++.dg/warn/Warray-bounds-6.C: New testcase.
* gcc.dg/tree-ssa/pr21559.c: Adjust.
* gcc.dg/tree-ssa/vrp17.c: Likewise.
* gcc.dg/tree-ssa/vrp18.c: Likewise.
* gcc.dg/tree-ssa/vrp23.c: Likewise.
* gcc.dg/tree-ssa/vrp24.c: Likewise.

From-SVN: r195940

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Warray-bounds-6.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
gcc/testsuite/gcc.dg/tree-ssa/vrp17.c
gcc/testsuite/gcc.dg/tree-ssa/vrp18.c
gcc/testsuite/gcc.dg/tree-ssa/vrp23.c
gcc/testsuite/gcc.dg/tree-ssa/vrp24.c
gcc/tree-vrp.c

index 24d22fae00fa70352407b8f695f0413e56728ffa..4c69a8d84e7ba3dc634f15d67e17e7b9516c267e 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-11  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56273
+       * tree-vrp.c (simplify_cond_using_ranges): Disable for the
+       first VRP run.
+       (check_array_ref): Fix missing newline in dumps.
+       (search_for_addr_array): Likewise.
+
 2013-02-09  David Edelsohn  <dje.gcc@gmail.com>
 
        * config/rs6000/aix61.h (OS_MISSING_ALTIVEC): Undefine.
index 53cbcf85ac2609d7d9960d704fa32974874dcdcc..e21dbf7dd8f6a3a57f59cebde9d261e442b83cec 100644 (file)
@@ -1,3 +1,13 @@
+2013-02-11  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56273
+       * g++.dg/warn/Warray-bounds-6.C: New testcase.
+       * gcc.dg/tree-ssa/pr21559.c: Adjust.
+       * gcc.dg/tree-ssa/vrp17.c: Likewise.
+       * gcc.dg/tree-ssa/vrp18.c: Likewise.
+       * gcc.dg/tree-ssa/vrp23.c: Likewise.
+       * gcc.dg/tree-ssa/vrp24.c: Likewise.
+
 2013-02-09  Uros Bizjak  <ubizjak@gmail.com>
 
        * g++.dg/asan/asan_test.C: Compile with -D__NO_INLINE__
diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-6.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-6.C
new file mode 100644 (file)
index 0000000..ee2862f
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-O3 -Warray-bounds" }
+
+struct type {
+    bool a, b;
+    bool get_b() { return b; }
+};
+
+type stuff[9u];
+
+void bar();
+
+void foo() {
+
+    for(unsigned i = 0u; i < 9u; i++) {
+
+       if(!stuff[i].a) {
+           continue;
+       }
+
+       bar();
+
+       for(unsigned j = i + 1u; j < 9u; j++) {
+           if(stuff[j].a && stuff[j].get_b()) { // { dg-bogus "array bounds" }
+               return;
+           }
+       }
+
+    }
+}
index 34f4a01db00bc1422e70634a46296bb8bb995ab0..d7d3bab154dc87e6f7d99071e2caa45042723244 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-vrp-details" } */
 
 static int blocksize = 4096;
 
@@ -32,7 +32,7 @@ void foo (void)
 
 
 /* First, we should simplify the bits < 0 test within the loop.  */
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */
 
 /* Second, we should thread the edge out of the loop via the break
    statement.  We also realize that the final bytes == 0 test is useless,
@@ -40,4 +40,4 @@ void foo (void)
 /* { dg-final { scan-tree-dump-times "Threaded jump" 3 "vrp1" } } */
 
 /* { dg-final { cleanup-tree-dump "vrp1" } } */
-
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
index c04b9ba7843526a707e8f61d0168153fffdcfe9f..c501a7f338fc523ed3acee79438f873d2d767d23 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-vrp2" } */
 
 extern void abort (void) __attribute__ ((__noreturn__));
 union tree_node;
@@ -27,6 +27,5 @@ gimplify_for_stmt (tree stmt)
     abort ();
 }
 
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
-/* { dg-final { cleanup-tree-dump "vrp1" } } */
-
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
index a3cc536ae56f857fe065fa8aa0907255ab3a40f7..610dd44cf2f2943a56715e601ea71e272bb4ba17 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-vrp2" } */
 
 static int blocksize = 4096;
 
@@ -30,5 +30,5 @@ void foo (void)
     eof_reached = 1;
 }
 
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
-/* { dg-final { cleanup-tree-dump "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
index 77899a65fcade2039514da746f62547139387333..6bca02b44e19c6fca6add73b2626c438a0e03998 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-vrp2-details" } */
 
 blah (int code1, int code2)
 {
@@ -40,6 +40,5 @@ L8:
 /* The n_sets > 0 test can be simplified into n_sets == 1 since the
    only way to reach the test is when n_sets <= 1, and the only value
    which satisfies both conditions is n_sets == 1.  */
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
-/* { dg-final { cleanup-tree-dump "vrp1" } } */
-
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp2" } } */
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
index 85e5b62d14804e1661a802445093690daa24f6ad..28e1a924f54b6cc982b05801427f541410b4a8a3 100644 (file)
@@ -1,6 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
-
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp2-details" } */
 
 struct rtx_def;
 typedef struct rtx_def *rtx;
@@ -86,6 +85,5 @@ L7:
    The second n_sets > 0 test can also be simplified into n_sets == 1
    as the only way to reach the tests is when n_sets <= 1 and the only
    value which satisfies both conditions is n_sets == 1.  */
-/* { dg-final { scan-tree-dump-times "Simplified relational" 2 "vrp1" } } */
-/* { dg-final { cleanup-tree-dump "vrp1" } } */
-
+/* { dg-final { scan-tree-dump-times "Simplified relational" 2 "vrp2" } } */
+/* { dg-final { cleanup-tree-dump "vrp2" } } */
index 0efac6045e3f5e3fca618c23b60e6ac84fac1289..a023a460371467e1d25bebe8ee11df7758b3518e 100644 (file)
@@ -6027,6 +6027,7 @@ check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
        {
          fprintf (dump_file, "Array bound warning for ");
          dump_generic_expr (MSG_NOTE, TDF_SLIM, ref);
+         fprintf (dump_file, "\n");
        }
       warning_at (location, OPT_Warray_bounds,
                  "array subscript is above array bounds");
@@ -6039,6 +6040,7 @@ check_array_ref (location_t location, tree ref, bool ignore_off_by_one)
        {
          fprintf (dump_file, "Array bound warning for ");
          dump_generic_expr (MSG_NOTE, TDF_SLIM, ref);
+         fprintf (dump_file, "\n");
        }
       warning_at (location, OPT_Warray_bounds,
                  "array subscript is below array bounds");
@@ -6112,6 +6114,7 @@ search_for_addr_array (tree t, location_t location)
            {
              fprintf (dump_file, "Array bound warning for ");
              dump_generic_expr (MSG_NOTE, TDF_SLIM, t);
+             fprintf (dump_file, "\n");
            }
          warning_at (location, OPT_Warray_bounds,
                      "array subscript is below array bounds");
@@ -6125,6 +6128,7 @@ search_for_addr_array (tree t, location_t location)
            {
              fprintf (dump_file, "Array bound warning for ");
              dump_generic_expr (MSG_NOTE, TDF_SLIM, t);
+             fprintf (dump_file, "\n");
            }
          warning_at (location, OPT_Warray_bounds,
                      "array subscript is above array bounds");
@@ -8499,9 +8503,8 @@ test_for_singularity (enum tree_code cond_code, tree op0,
   return NULL;
 }
 
-/* Simplify a conditional using a relational operator to an equality
-   test if the range information indicates only one value can satisfy
-   the original conditional.  */
+/* Simplify the conditional stmt STMT using final range information.
+   Return true if we simplified the statement.  */
 
 static bool
 simplify_cond_using_ranges (gimple stmt)
@@ -8510,7 +8513,13 @@ simplify_cond_using_ranges (gimple stmt)
   tree op1 = gimple_cond_rhs (stmt);
   enum tree_code cond_code = gimple_cond_code (stmt);
 
-  if (cond_code != NE_EXPR
+  /* Simplify a conditional using a relational operator to an equality
+     test if the range information indicates only one value can satisfy
+     the original conditional.
+     Do that only in the second VRP pass as otherwise assertions derived
+     from this predicate are weakened.  */
+  if (!first_pass_instance
+      && cond_code != NE_EXPR
       && cond_code != EQ_EXPR
       && TREE_CODE (op0) == SSA_NAME
       && INTEGRAL_TYPE_P (TREE_TYPE (op0))