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>
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>
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:
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
{