mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
183ae5958e
commit
e2cefdd9d0
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue