+2018-01-12 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * tree-predcom.c (aff_combination_dr_offset): Use wi::to_poly_widest
+ rather than wi::to_widest for DR_INITs.
+ * tree-vect-data-refs.c (vect_find_same_alignment_drs): Use
+ wi::to_poly_offset rather than wi::to_offset for DR_INIT.
+ (vect_analyze_data_ref_accesses): Require both DR_INITs to be
+ INTEGER_CSTs.
+ (vect_analyze_group_access_1): Note that here.
+
2018-01-12 Richard Sandiford <richard.sandiford@linaro.org>
* tree-vectorizer.c (get_vec_alignment_for_array_type): Handle
tree_to_aff_combination_expand (DR_OFFSET (dr), type, offset,
&name_expansions);
- aff_combination_const (&delta, type, wi::to_widest (DR_INIT (dr)));
+ aff_combination_const (&delta, type, wi::to_poly_widest (DR_INIT (dr)));
aff_combination_add (offset, &delta);
}
return;
/* Two references with distance zero have the same alignment. */
- offset_int diff = (wi::to_offset (DR_INIT (dra))
- - wi::to_offset (DR_INIT (drb)));
- if (diff != 0)
+ poly_offset_int diff = (wi::to_poly_offset (DR_INIT (dra))
+ - wi::to_poly_offset (DR_INIT (drb)));
+ if (maybe_ne (diff, 0))
{
/* Get the wider of the two alignments. */
unsigned int align_a = (vect_calculate_target_alignment (dra)
unsigned int max_align = MAX (align_a, align_b);
/* Require the gap to be a multiple of the larger vector alignment. */
- if (!wi::multiple_of_p (diff, max_align, SIGNED))
+ if (!multiple_p (diff, max_align))
return;
}
gimple *prev = stmt;
HOST_WIDE_INT diff, gaps = 0;
+ /* By construction, all group members have INTEGER_CST DR_INITs. */
while (next)
{
/* Skip same data-refs. In case that two or more stmts share
TREE_TYPE (DR_REF (drb))))
break;
+ /* Check that the DR_INITs are compile-time constants. */
+ if (TREE_CODE (DR_INIT (dra)) != INTEGER_CST
+ || TREE_CODE (DR_INIT (drb)) != INTEGER_CST)
+ break;
+
/* Sorting has ensured that DR_INIT (dra) <= DR_INIT (drb). */
HOST_WIDE_INT init_a = TREE_INT_CST_LOW (DR_INIT (dra));
HOST_WIDE_INT init_b = TREE_INT_CST_LOW (DR_INIT (drb));