+2017-07-03 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * tree-data-ref.h (dr_alignment): Declare.
+ * tree-data-ref.c (dr_alignment): New function.
+ * tree-vectorizer.h (dataref_aux): Remove base_element_aligned.
+ * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Don't
+ set it.
+ * tree-vect-stmts.c (vectorizable_store): Use dr_alignment.
+
2017-07-03 Richard Sandiford <richard.sandiford@linaro.org>
* tree-data-ref.h (innermost_loop_behavior): Add base_alignment
return NULL_TREE;
}
+/* Return the alignment in bytes that DRB is guaranteed to have at all
+ times. */
+
+unsigned int
+dr_alignment (innermost_loop_behavior *drb)
+{
+ /* Get the alignment of BASE_ADDRESS + INIT. */
+ unsigned int alignment = drb->base_alignment;
+ unsigned int misalignment = (drb->base_misalignment
+ + TREE_INT_CST_LOW (drb->init));
+ if (misalignment != 0)
+ alignment = MIN (alignment, misalignment & -misalignment);
+
+ /* Cap it to the alignment of OFFSET. */
+ if (!integer_zerop (drb->offset))
+ alignment = MIN (alignment, drb->offset_alignment);
+
+ /* Cap it to the alignment of STEP. */
+ if (!integer_zerop (drb->step))
+ alignment = MIN (alignment, drb->step_alignment);
+
+ return alignment;
+}
+
/* Recursive helper function. */
static bool
vec<loop_p>, bool);
extern tree find_data_references_in_bb (struct loop *, basic_block,
vec<data_reference_p> *);
+extern unsigned int dr_alignment (innermost_loop_behavior *);
+
+/* Return the alignment in bytes that DR is guaranteed to have at all
+ times. */
+
+inline unsigned int
+dr_alignment (data_reference *dr)
+{
+ return dr_alignment (&DR_INNERMOST (dr));
+}
extern bool dr_may_alias_p (const struct data_reference *,
const struct data_reference *, bool);
unsigned int base_alignment = drb->base_alignment;
unsigned int base_misalignment = drb->base_misalignment;
unsigned HOST_WIDE_INT vector_alignment = TYPE_ALIGN_UNIT (vectype);
- unsigned HOST_WIDE_INT element_alignment
- = TYPE_ALIGN_UNIT (TREE_TYPE (vectype));
-
- if (base_alignment >= element_alignment
- && (base_misalignment & (element_alignment - 1)) == 0)
- DR_VECT_AUX (dr)->base_element_aligned = true;
if (drb->offset_alignment < vector_alignment
|| !step_preserves_misalignment_p
DR_VECT_AUX (dr)->base_decl = base;
DR_VECT_AUX (dr)->base_misaligned = true;
- DR_VECT_AUX (dr)->base_element_aligned = true;
base_misalignment = 0;
}
unsigned int misalignment = (base_misalignment
misalign = 0;
else if (DR_MISALIGNMENT (first_dr) == -1)
{
- if (DR_VECT_AUX (first_dr)->base_element_aligned)
- align = TYPE_ALIGN_UNIT (elem_type);
- else
- align = get_object_alignment (DR_REF (first_dr))
- / BITS_PER_UNIT;
+ align = dr_alignment (vect_dr_behavior (first_dr));
misalign = 0;
TREE_TYPE (data_ref)
= build_aligned_type (TREE_TYPE (data_ref),
}
else if (DR_MISALIGNMENT (first_dr) == -1)
{
- if (DR_VECT_AUX (first_dr)->base_element_aligned)
- align = TYPE_ALIGN_UNIT (elem_type);
- else
- align = (get_object_alignment (DR_REF (first_dr))
- / BITS_PER_UNIT);
+ align = dr_alignment (vect_dr_behavior (first_dr));
misalign = 0;
TREE_TYPE (data_ref)
= build_aligned_type (TREE_TYPE (data_ref),
int misalignment;
/* If true the alignment of base_decl needs to be increased. */
bool base_misaligned;
- /* If true we know the base is at least vector element alignment aligned. */
- bool base_element_aligned;
tree base_decl;
};