re PR tree-optimization/36648 (segfault in global constructor with -O3)

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
This commit is contained in:
Ira Rosen 2008-06-30 11:43:55 +00:00 committed by Ira Rosen
parent 183ae5958e
commit e2cefdd9d0
4 changed files with 46 additions and 18 deletions

View 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> 2008-06-30 Richard Guenther <rguenther@suse.de>
PR middle-end/36671 PR middle-end/36671

View 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> 2008-06-29 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36655 PR c++/36655

View File

@ -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" } } */

View File

@ -6725,16 +6725,14 @@ vect_do_peeling_for_loop_bound (loop_vec_info loop_vinfo, tree *ratio)
Else, compute address misalignment in bytes: Else, compute address misalignment in bytes:
addr_mis = addr & (vectype_size - 1) addr_mis = addr & (vectype_size - 1)
prolog_niters = min ( LOOP_NITERS , (VF - addr_mis/elem_size)&(VF-1) ) prolog_niters = min (LOOP_NITERS, ((VF - addr_mis/elem_size)&(VF-1))/step)
(elem_size = element type size; an element is the scalar element (elem_size = element type size; an element is the scalar element whose type
whose type is the inner type of the vectype) is the inner type of the vectype)
For interleaving, 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
prolog_niters = min ( LOOP_NITERS , (which is equal to the size of interleaved group).
(VF/group_size - addr_mis/elem_size)&(VF/group_size-1) )
where group_size is the size of the interleaved group.
The above formulas assume that VF == number of elements in the vector. This The above formulas assume that VF == number of elements in the vector. This
may not hold when there are multiple-types in the loop. 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); tree vectype = STMT_VINFO_VECTYPE (stmt_info);
int vectype_align = TYPE_ALIGN (vectype) / BITS_PER_UNIT; int vectype_align = TYPE_ALIGN (vectype) / BITS_PER_UNIT;
tree niters_type = TREE_TYPE (loop_niters); 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 element_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
int nelements = TYPE_VECTOR_SUBPARTS (vectype); int nelements = TYPE_VECTOR_SUBPARTS (vectype);
if (STMT_VINFO_STRIDED_ACCESS (stmt_info)) if (STMT_VINFO_STRIDED_ACCESS (stmt_info))
{ step = DR_GROUP_SIZE (vinfo_for_stmt (DR_GROUP_FIRST_DR (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;
}
pe = loop_preheader_edge (loop); 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)) if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "known alignment = %d.", byte_misalign); fprintf (vect_dump, "known alignment = %d.", byte_misalign);
iters = build_int_cst (niters_type, iters = build_int_cst (niters_type,
(nelements - elem_misalign)&(nelements/group_size-1)); (((nelements - elem_misalign) & (nelements - 1)) / step));
} }
else else
{ {