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> 2008-06-30 Richard Guenther <rguenther@suse.de>
PR middle-end/36671 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> 2008-06-29 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36655 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) ...@@ -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) ...@@ -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) ...@@ -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
{ {
......
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