diff options
author | Richard Biener <rguenther@suse.de> | 2013-03-28 09:55:15 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-03-28 09:55:15 +0000 |
commit | a64b9c261d9d2c12b98bd14f5f1bf27e3bcb6bdd (patch) | |
tree | fcc4b9380bfadbb4d5f3785c7d03fcf3f6818fc9 /gcc/tree-vect-stmts.c | |
parent | a9dc2a2f95a6a88c99a75aa16f7a43f2c2c3e93a (diff) | |
download | gcc-a64b9c261d9d2c12b98bd14f5f1bf27e3bcb6bdd.zip gcc-a64b9c261d9d2c12b98bd14f5f1bf27e3bcb6bdd.tar.gz gcc-a64b9c261d9d2c12b98bd14f5f1bf27e3bcb6bdd.tar.bz2 |
re PR tree-optimization/37021 (Fortran Complex reduction / multiplication not vectorized)
2013-03-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/37021
* tree-vect-slp.c (vect_build_slp_tree): When not unrolling
do not restrict gaps between groups.
* tree-vect-stmts.c (vectorizable_load): Properly account for
a gap between groups.
* gcc.dg/vect/fast-math-slp-38.c: New testcase.
* gcc.dg/vect/O3-pr36098.c: Un-XFAIL.
From-SVN: r197189
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r-- | gcc/tree-vect-stmts.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index a714428..4bd8415 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -4316,7 +4316,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, gimple ptr_incr; int nunits = TYPE_VECTOR_SUBPARTS (vectype); int ncopies; - int i, j, group_size; + int i, j, group_size, group_gap; tree msq = NULL_TREE, lsq; tree offset = NULL_TREE; tree realignment_token = NULL_TREE; @@ -4766,15 +4766,20 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); if (SLP_INSTANCE_LOAD_PERMUTATION (slp_node_instance).exists ()) slp_perm = true; + group_gap = GROUP_GAP (vinfo_for_stmt (first_stmt)); } else - vec_num = group_size; + { + vec_num = group_size; + group_gap = 0; + } } else { first_stmt = stmt; first_dr = dr; group_size = vec_num = 1; + group_gap = 0; } alignment_support_scheme = vect_supportable_dr_alignment (first_dr, false); @@ -5134,6 +5139,15 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, if (slp && !slp_perm) SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt); } + /* Bump the vector pointer to account for a gap. */ + if (slp && group_gap != 0) + { + tree bump = size_binop (MULT_EXPR, + TYPE_SIZE_UNIT (elem_type), + size_int (group_gap)); + dataref_ptr = bump_vector_ptr (dataref_ptr, ptr_incr, gsi, + stmt, bump); + } } if (slp && !slp_perm) |