Commit e2cefdd9 by Ira Rosen Committed by Ira Rosen

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
parent 183ae595
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
......
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
......
/* { 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" } } */
......@@ -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
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment