Commit 836dbb1a by Richard Sandiford Committed by Richard Sandiford

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
parent f17a223d
2016-05-24 Richard Sandiford <richard.sandiford@arm.com>
* 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 <rguenther@suse.de> 2016-05-24 Richard Biener <rguenther@suse.de>
PR middle-end/70434 PR middle-end/70434
......
...@@ -2233,6 +2233,7 @@ vect_analyze_group_access_1 (struct data_reference *dr) ...@@ -2233,6 +2233,7 @@ vect_analyze_group_access_1 (struct data_reference *dr)
{ {
GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = stmt; GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = stmt;
GROUP_SIZE (vinfo_for_stmt (stmt)) = groupsize; GROUP_SIZE (vinfo_for_stmt (stmt)) = groupsize;
GROUP_GAP (stmt_info) = groupsize - 1;
if (dump_enabled_p ()) if (dump_enabled_p ())
{ {
dump_printf_loc (MSG_NOTE, vect_location, dump_printf_loc (MSG_NOTE, vect_location,
......
...@@ -6308,7 +6308,6 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -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 that leaves unused vector loads around punt - we at least create
very sub-optimal code in that case (and blow up memory, very sub-optimal code in that case (and blow up memory,
see PR65518). */ see PR65518). */
bool force_peeling = false;
if (first_stmt == stmt if (first_stmt == stmt
&& !GROUP_NEXT_ELEMENT (stmt_info)) && !GROUP_NEXT_ELEMENT (stmt_info))
{ {
...@@ -6322,7 +6321,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -6322,7 +6321,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
} }
/* Single-element interleaving requires peeling for gaps. */ /* 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 /* 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, ...@@ -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. */ elements in the last iteration and thus need to peel that off. */
if (loop_vinfo if (loop_vinfo
&& ! STMT_VINFO_STRIDED_P (stmt_info) && ! 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))) || (!slp && vf % GROUP_SIZE (vinfo_for_stmt (first_stmt)) != 0)))
{ {
if (dump_enabled_p ()) if (dump_enabled_p ())
......
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