+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
{
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);
/* 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;
&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)