re PR middle-end/30442 (Expanded array initialization can use memset builtin function)
authorRichard Guenther <rguenther@suse.de>
Tue, 5 Jun 2012 12:38:26 +0000 (12:38 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Jun 2012 12:38:26 +0000 (12:38 +0000)
2012-06-05  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/30442
* tree-vect-data-refs.c (vect_analyze_data_refs): For basic-block
vectorization stop analysis at the first stmt we cannot compute
a data-reference for instead of giving up completely.

* gcc.dg/vect/bb-slp-30.c: New testcase.

From-SVN: r188235

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/bb-slp-30.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index 0a3fd741af40b71d29c8791555012938d9db1af8..50b32453a8176c698595fddb8bafa5febe27193b 100644 (file)
@@ -1,3 +1,10 @@
+2012-06-05  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/30442
+       * tree-vect-data-refs.c (vect_analyze_data_refs): For basic-block
+       vectorization stop analysis at the first stmt we cannot compute
+       a data-reference for instead of giving up completely.
+
 2012-06-05  Richard Guenther  <rguenther@suse.de>
 
        * tree-loop-distribution.c (struct partition_s): Add has_writes
index 3bfc678473c7cb7c69250c31d33076fb738429a5..e237c41da8d09b6f8511e85ecf30943773737d47 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-05  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/30442
+       * gcc.dg/vect/bb-slp-30.c: New testcase.
+
 2012-06-05  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/53081
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-30.c b/gcc/testsuite/gcc.dg/vect/bb-slp-30.c
new file mode 100644 (file)
index 0000000..63689e3
--- /dev/null
@@ -0,0 +1,47 @@
+/* { dg-require-effective-target vect_int } */
+
+int a[32];
+
+void __attribute__((noinline))
+test1(void)
+{
+  a[0] = 1;
+  a[1] = 1;
+  a[2] = 1;
+  a[3] = 1;
+  a[4] = 1;
+  a[5] = 1;
+  a[6] = 1;
+  a[7] = 1;
+  a[8] = 1;
+  a[9] = 1;
+  a[10] = 1;
+  a[11] = 1;
+  a[12] = 1;
+  a[13] = 1;
+  a[14] = 1;
+  a[15] = 1;
+  a[16] = 1;
+  a[17] = 1;
+  a[18] = 1;
+  a[19] = 1;
+  a[20] = 1;
+  a[21] = 1;
+  a[22] = 1;
+  a[23] = 1;
+  a[24] = 1;
+  a[25] = 1;
+  a[26] = 1;
+  a[27] = 1;
+  a[28] = 1;
+  a[29] = 1;
+  a[30] = 1;
+  a[31] = 1;
+  asm ("" : : : "memory");
+  a[21] = 0;
+}
+
+int main() { test1(); return a[21]; }
+
+/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" } } */
+/* { dg-final { cleanup-tree-dump "slp" } } */
index e34f41a3f1f975459875dc63e1a6aa98f3f0408e..aa384d2cadcfc7c57a61959b0e728ede21c4bddb 100644 (file)
@@ -2844,11 +2844,23 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo,
     }
   else
     {
+      gimple_stmt_iterator gsi;
+
       bb = BB_VINFO_BB (bb_vinfo);
-      res = compute_data_dependences_for_bb (bb, true,
-                                            &BB_VINFO_DATAREFS (bb_vinfo),
-                                            &BB_VINFO_DDRS (bb_vinfo));
-      if (!res)
+      for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+       {
+         gimple stmt = gsi_stmt (gsi);
+         if (!find_data_references_in_stmt (NULL, stmt,
+                                            &BB_VINFO_DATAREFS (bb_vinfo)))
+           {
+             /* Mark the rest of the basic-block as unvectorizable.  */
+             for (; !gsi_end_p (gsi); gsi_next (&gsi))
+               STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false;
+             break;
+           }
+       }
+      if (!compute_all_dependences (BB_VINFO_DATAREFS (bb_vinfo),
+                                   &BB_VINFO_DDRS (bb_vinfo), NULL, true))
        {
          if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS))
            fprintf (vect_dump, "not vectorized: basic block contains function"