diff options
author | Richard Biener <rguenther@suse.de> | 2015-12-01 14:24:54 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-12-01 14:24:54 +0000 |
commit | 4f0a0218d6df34ec612a61aef50b95d79cd8d17f (patch) | |
tree | 25b658c07a9bfa509d5726fe009464b9133a2068 /gcc/tree-vect-stmts.c | |
parent | 2d3f4bf73cdb878c0fee25b962b6a80113d5d80e (diff) | |
download | gcc-4f0a0218d6df34ec612a61aef50b95d79cd8d17f.zip gcc-4f0a0218d6df34ec612a61aef50b95d79cd8d17f.tar.gz gcc-4f0a0218d6df34ec612a61aef50b95d79cd8d17f.tar.bz2 |
re PR tree-optimization/68379 (BB vectorization: definition in block 13 follows the use for SSA_NAME)
2015-12-01 Richard Biener <rguenther@suse.de>
PR tree-optimization/68379
* tree-vect-stmts.c (vectorizable_load): For BB vectorization
always base loads on the first used DR of a group.
* tree-vect-data-refs.c (vect_slp_analyze_and_verify_node_alignment):
Compute alignment of the first scalar element unconditionally.
* gcc.dg/torture/pr68379.c: New testcase.
* gfortran.dg/pr68379-1.f90: Likewise.
* gfortran.dg/pr68379-2.f: Likewise.
From-SVN: r231111
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r-- | gcc/tree-vect-stmts.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 5bb2289..db46eec 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -6148,6 +6148,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, bool grouped_load = false; bool load_lanes_p = false; gimple *first_stmt; + gimple *first_stmt_for_drptr = NULL; bool inv_p; bool negative = false; bool compute_in_loop = false; @@ -6751,10 +6752,14 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, if (grouped_load) { first_stmt = GROUP_FIRST_ELEMENT (stmt_info); - /* For BB vectorization we directly vectorize a subchain + /* For SLP vectorization we directly vectorize a subchain without permutation. */ if (slp && ! SLP_TREE_LOAD_PERMUTATION (slp_node).exists ()) - first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0]; + first_stmt = SLP_TREE_SCALAR_STMTS (slp_node)[0]; + /* For BB vectorization always use the first stmt to base + the data ref pointer on. */ + if (bb_vinfo) + first_stmt_for_drptr = SLP_TREE_SCALAR_STMTS (slp_node)[0]; /* Check if the chain of loads is already vectorized. */ if (STMT_VINFO_VEC_STMT (vinfo_for_stmt (first_stmt)) @@ -6966,6 +6971,24 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, (DR_REF (first_dr)), 0); inv_p = false; } + else if (first_stmt_for_drptr + && first_stmt != first_stmt_for_drptr) + { + dataref_ptr + = vect_create_data_ref_ptr (first_stmt_for_drptr, aggr_type, + at_loop, offset, &dummy, gsi, + &ptr_incr, simd_lane_access_p, + &inv_p, byte_offset); + /* Adjust the pointer by the difference to first_stmt. */ + data_reference_p ptrdr + = STMT_VINFO_DATA_REF (vinfo_for_stmt (first_stmt_for_drptr)); + tree diff = fold_convert (sizetype, + size_binop (MINUS_EXPR, + DR_INIT (first_dr), + DR_INIT (ptrdr))); + dataref_ptr = bump_vector_ptr (dataref_ptr, ptr_incr, gsi, + stmt, diff); + } else dataref_ptr = vect_create_data_ref_ptr (first_stmt, aggr_type, at_loop, |