Commit 25f68d90 by Richard Sandiford Committed by Richard Sandiford

Add a helper for getting the overall alignment of a DR

This combines the information from previous patches to give a guaranteed
alignment for the DR as a whole.  This should be a bit safer than using
base_element_aligned, since that only really took the base into account
(not the init or offset).

2017-07-03  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
	* 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.

From-SVN: r249917
parent bb642979
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
and base_misalignment fields.
(DR_BASE_ALIGNMENT, DR_BASE_MISALIGNMENT): New macros.
......
......@@ -4770,6 +4770,30 @@ find_data_references_in_loop (struct loop *loop,
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
......
......@@ -405,6 +405,16 @@ extern bool compute_all_dependences (vec<data_reference_p> ,
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);
......
......@@ -731,12 +731,6 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
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
......@@ -797,7 +791,6 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
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
......
......@@ -6353,11 +6353,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
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),
......@@ -7429,11 +7425,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
}
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),
......
......@@ -754,8 +754,6 @@ struct dataref_aux {
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;
};
......
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