From 836dbb1a27f3e793ad32723aeb6630237887e6d5 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 24 May 2016 10:13:35 +0000 Subject: [PATCH] Fix GROUP_GAP for single-element interleaving vectorizable_load had a curious "force_peeling" variable, with no comment explaining why we need it for single-element interleaving but not for other cases. I think it's simply because we weren't initialising the GROUP_GAP correctly for single loads. Tested on aarch64-linux-gnu and x86_64-linux-gnu. gcc/ * tree-vect-data-refs.c (vect_analyze_group_access_1): Set GROUP_GAP for single-element interleaving. * tree-vect-stmts.c (vectorizable_load): Remove force_peeling variable. From-SVN: r236631 --- gcc/ChangeLog | 7 +++++++ gcc/tree-vect-data-refs.c | 1 + gcc/tree-vect-stmts.c | 6 ++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d94460e9419..a61b6cd97d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-05-24 Richard Sandiford + + * tree-vect-data-refs.c (vect_analyze_group_access_1): Set + GROUP_GAP for single-element interleaving. + * tree-vect-stmts.c (vectorizable_load): Remove force_peeling + variable. + 2016-05-24 Richard Biener PR middle-end/70434 diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 7652e216eb6..36d302a056c 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -2233,6 +2233,7 @@ vect_analyze_group_access_1 (struct data_reference *dr) { GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = stmt; GROUP_SIZE (vinfo_for_stmt (stmt)) = groupsize; + GROUP_GAP (stmt_info) = groupsize - 1; if (dump_enabled_p ()) { dump_printf_loc (MSG_NOTE, vect_location, diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 3bcd0ce1946..f66e1806208 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -6308,7 +6308,6 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, that leaves unused vector loads around punt - we at least create very sub-optimal code in that case (and blow up memory, see PR65518). */ - bool force_peeling = false; if (first_stmt == stmt && !GROUP_NEXT_ELEMENT (stmt_info)) { @@ -6322,7 +6321,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, } /* Single-element interleaving requires peeling for gaps. */ - force_peeling = true; + gcc_assert (GROUP_GAP (stmt_info)); } /* If there is a gap in the end of the group or the group size cannot @@ -6330,8 +6329,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, elements in the last iteration and thus need to peel that off. */ if (loop_vinfo && ! STMT_VINFO_STRIDED_P (stmt_info) - && (force_peeling - || GROUP_GAP (vinfo_for_stmt (first_stmt)) != 0 + && (GROUP_GAP (vinfo_for_stmt (first_stmt)) != 0 || (!slp && vf % GROUP_SIZE (vinfo_for_stmt (first_stmt)) != 0))) { if (dump_enabled_p ()) -- 2.30.2