aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-04-29 08:15:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-04-29 08:15:52 +0000
commitc80476994516f9df0063bd787a5cfc8aed686c3c (patch)
tree2435464918c4b85c27aa58a119d6e54feebcbdc6 /gcc
parentb4d1725b5481fd693f078bd06e1e5b8209a89269 (diff)
downloadgcc-c80476994516f9df0063bd787a5cfc8aed686c3c.zip
gcc-c80476994516f9df0063bd787a5cfc8aed686c3c.tar.gz
gcc-c80476994516f9df0063bd787a5cfc8aed686c3c.tar.bz2
tree-vect-data-refs.c (vect_analyze_group_access): Properly compute GROUP_SIZE for basic-block SLP.
2015-04-29 Richard Biener <rguenther@suse.de> * tree-vect-data-refs.c (vect_analyze_group_access): Properly compute GROUP_SIZE for basic-block SLP. * tree-vect-slp.c (vect_get_place_in_interleaving_chain): Properly take into account gaps. (vect_get_mask_element): Properly reject references to previous vectors. (vect_transform_slp_perm_load): Likewise. From-SVN: r222560
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/tree-vect-data-refs.c2
-rw-r--r--gcc/tree-vect-slp.c18
3 files changed, 27 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9a58cbe..49e6d80 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2015-04-29 Richard Biener <rguenther@suse.de>
+
+ * tree-vect-data-refs.c (vect_analyze_group_access): Properly
+ compute GROUP_SIZE for basic-block SLP.
+ * tree-vect-slp.c (vect_get_place_in_interleaving_chain): Properly
+ take into account gaps.
+ (vect_get_mask_element): Properly reject references to previous
+ vectors.
+ (vect_transform_slp_perm_load): Likewise.
+
2015-04-29 Christian Bruel <christian.bruel@st.com>
PR target/64835
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 3913862eb..96afc7a 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -2245,7 +2245,7 @@ vect_analyze_group_access (struct data_reference *dr)
}
if (groupsize == 0)
- groupsize = count;
+ groupsize = count + gaps;
GROUP_SIZE (vinfo_for_stmt (stmt)) = groupsize;
if (dump_enabled_p ())
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index b066763..60f257b 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -223,8 +223,9 @@ vect_get_place_in_interleaving_chain (gimple stmt, gimple first_stmt)
{
if (next_stmt == stmt)
return result;
- result++;
next_stmt = GROUP_NEXT_ELEMENT (vinfo_for_stmt (next_stmt));
+ if (next_stmt)
+ result += GROUP_GAP (vinfo_for_stmt (next_stmt));
}
while (next_stmt);
@@ -3008,6 +3009,18 @@ vect_get_mask_element (gimple stmt, int first_mask_element, int m,
/* Adjust the value in case it's a mask for second and third vectors. */
*current_mask_element -= mask_nunits * (*number_of_mask_fixes - 1);
+ if (*current_mask_element < 0)
+ {
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "permutation requires past vector ");
+ dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0);
+ dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
+ }
+ return false;
+ }
+
if (*current_mask_element < mask_nunits)
*needs_first_vector = true;
@@ -3178,7 +3191,8 @@ vect_transform_slp_perm_load (slp_tree node, vec<tree> dr_chain,
&number_of_mask_fixes, &mask_fixed,
&needs_first_vector))
return false;
- gcc_assert (current_mask_element < 2 * nunits);
+ gcc_assert (current_mask_element >= 0
+ && current_mask_element < 2 * nunits);
mask[index++] = current_mask_element;
if (index == nunits)