re PR tree-optimization/36648 (segfault in global constructor with -O3)
authorIra Rosen <irar@il.ibm.com>
Mon, 30 Jun 2008 11:43:55 +0000 (11:43 +0000)
committerIra Rosen <irar@gcc.gnu.org>
Mon, 30 Jun 2008 11:43:55 +0000 (11:43 +0000)
PR tree-optimization/36648
* tree-vect-transform.c (vect_do_peeling_for_loop_bound): Divide
number of prolog iterations by step. Fix the comment.

From-SVN: r137272

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr36648.cc [new file with mode: 0644]
gcc/tree-vect-transform.c

index b4695d3eeac934b42f157a0b5bebe3b6be373d8c..a7832ec0adc5e13daeb5157d9c3c3eff7ade12be 100644 (file)
@@ -1,3 +1,9 @@
+2008-06-30  Ira Rosen  <irar@il.ibm.com>
+
+       PR tree-optimization/36648
+       * tree-vect-transform.c (vect_do_peeling_for_loop_bound): Divide
+       number of prolog iterations by step. Fix the comment.
+
 2008-06-30  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/36671
index e1c86aeff2d8a6eabfb79e478dbbbc998e84579a..a23526877dddbafa081dc95891c2b52e63d19035 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-30  Ira Rosen  <irar@il.ibm.com>
+
+       PR tree-optimization/36648
+       * g++.dg/vect/pr36648.cc: New testcase.
+
 2008-06-29  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/36655
diff --git a/gcc/testsuite/g++.dg/vect/pr36648.cc b/gcc/testsuite/g++.dg/vect/pr36648.cc
new file mode 100644 (file)
index 0000000..b293303
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-require-effective-target vect_float } */
+
+struct vector
+{
+  vector() : x(0), y(0), z(0) { }
+  float x,y,z;
+};
+
+struct Foo
+{
+  int dummy;
+  /* Misaligned access.  */
+  vector array_of_vectors[4];
+};
+
+Foo foo;
+
+int main() { }
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } }*/
+/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+
index 4110b335d7450c274bc14d8b93505b7c66f1253d..1fa786da0b9618add6b5af571dc7420d43960317 100644 (file)
@@ -6725,16 +6725,14 @@ vect_do_peeling_for_loop_bound (loop_vec_info loop_vinfo, tree *ratio)
    Else, compute address misalignment in bytes:
      addr_mis = addr & (vectype_size - 1)
 
-   prolog_niters = min ( LOOP_NITERS , (VF - addr_mis/elem_size)&(VF-1) )
-   
-   (elem_size = element type size; an element is the scalar element 
-       whose type is the inner type of the vectype)  
+   prolog_niters = min (LOOP_NITERS, ((VF - addr_mis/elem_size)&(VF-1))/step)
 
-   For interleaving,
+   (elem_size = element type size; an element is the scalar element whose type
+   is the inner type of the vectype)
 
-   prolog_niters = min ( LOOP_NITERS , 
-                        (VF/group_size - addr_mis/elem_size)&(VF/group_size-1) )
-        where group_size is the size of the interleaved group.
+   When the step of the data-ref in the loop is not 1 (as in interleaved data
+   and SLP), the number of iterations of the prolog must be divided by the step
+   (which is equal to the size of interleaved group).
 
    The above formulas assume that VF == number of elements in the vector. This
    may not hold when there are multiple-types in the loop.
@@ -6756,18 +6754,12 @@ vect_gen_niters_for_prolog_loop (loop_vec_info loop_vinfo, tree loop_niters)
   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
   int vectype_align = TYPE_ALIGN (vectype) / BITS_PER_UNIT;
   tree niters_type = TREE_TYPE (loop_niters);
-  int group_size = 1;
+  int step = 1;
   int element_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
   int nelements = TYPE_VECTOR_SUBPARTS (vectype);
 
   if (STMT_VINFO_STRIDED_ACCESS (stmt_info))
-    {
-      /* For interleaved access element size must be multiplied by the size of
-        the interleaved group.  */
-      group_size = DR_GROUP_SIZE (vinfo_for_stmt (
-                                              DR_GROUP_FIRST_DR (stmt_info)));
-      element_size *= group_size;
-    }
+    step = DR_GROUP_SIZE (vinfo_for_stmt (DR_GROUP_FIRST_DR (stmt_info)));
 
   pe = loop_preheader_edge (loop); 
 
@@ -6778,8 +6770,9 @@ vect_gen_niters_for_prolog_loop (loop_vec_info loop_vinfo, tree loop_niters)
 
       if (vect_print_dump_info (REPORT_DETAILS))
         fprintf (vect_dump, "known alignment = %d.", byte_misalign);
-      iters = build_int_cst (niters_type, 
-                            (nelements - elem_misalign)&(nelements/group_size-1));
+
+      iters = build_int_cst (niters_type,
+                     (((nelements - elem_misalign) & (nelements - 1)) / step));
     }
   else
     {