diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-09-22 16:44:29 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-09-22 16:44:29 +0000 |
commit | f702e7d43f2aec71640d0db7ecf1543ba75f37c3 (patch) | |
tree | 9beee33fae8a909f405a3f3bb2328cab22dde95c /gcc/tree-vectorizer.h | |
parent | b2b67217d3c0901f7c414b7f4b4a92e92678846e (diff) | |
download | gcc-f702e7d43f2aec71640d0db7ecf1543ba75f37c3.zip gcc-f702e7d43f2aec71640d0db7ecf1543ba75f37c3.tar.gz gcc-f702e7d43f2aec71640d0db7ecf1543ba75f37c3.tar.bz2 |
Let the target choose a vectorisation alignment
The vectoriser aligned vectors to TYPE_ALIGN unconditionally, although
there was also a hard-coded assumption that this was equal to the type
size. This was inconvenient for SVE for two reasons:
- When compiling for a specific power-of-2 SVE vector length, we might
want to align to a full vector. However, the TYPE_ALIGN is governed
by the ABI alignment, which is 128 bits regardless of size.
- For vector-length-agnostic code it doesn't usually make sense to align,
since the runtime vector length might not be a power of two. Even for
power of two sizes, there's no guarantee that aligning to the previous
16 bytes will be an improveent.
This patch therefore adds a target hook to control the preferred
vectoriser (as opposed to ABI) alignment.
2017-09-22 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* target.def (preferred_vector_alignment): New hook.
* doc/tm.texi.in (TARGET_VECTORIZE_PREFERRED_VECTOR_ALIGNMENT): New
hook.
* doc/tm.texi: Regenerate.
* targhooks.h (default_preferred_vector_alignment): Declare.
* targhooks.c (default_preferred_vector_alignment): New function.
* tree-vectorizer.h (dataref_aux): Add a target_alignment field.
Expand commentary.
(DR_TARGET_ALIGNMENT): New macro.
(aligned_access_p): Update commentary.
(vect_known_alignment_in_bytes): New function.
* tree-vect-data-refs.c (vect_calculate_required_alignment): New
function.
(vect_compute_data_ref_alignment): Set DR_TARGET_ALIGNMENT.
Calculate the misalignment based on the target alignment rather than
the vector size.
(vect_update_misalignment_for_peel): Use DR_TARGET_ALIGMENT
rather than TYPE_ALIGN / BITS_PER_UNIT to update the misalignment.
(vect_enhance_data_refs_alignment): Mask the byte misalignment with
the target alignment, rather than masking the element misalignment
with the number of elements in a vector. Also use the target
alignment when calculating the maximum number of peels.
(vect_find_same_alignment_drs): Use vect_calculate_required_alignment
instead of TYPE_ALIGN_UNIT.
(vect_duplicate_ssa_name_ptr_info): Remove stmt_info parameter.
Measure DR_MISALIGNMENT relative to DR_TARGET_ALIGNMENT.
(vect_create_addr_base_for_vector_ref): Update call accordingly.
(vect_create_data_ref_ptr): Likewise.
(vect_setup_realignment): Realign by ANDing with
-DR_TARGET_MISALIGNMENT.
* tree-vect-loop-manip.c (vect_gen_prolog_loop_niters): Calculate
the number of peels based on DR_TARGET_ALIGNMENT.
* tree-vect-stmts.c (get_group_load_store_type): Compare the gap
with the guaranteed alignment boundary when deciding whether
overrun is OK.
(vectorizable_mask_load_store): Interpret DR_MISALIGNMENT
relative to DR_TARGET_ALIGNMENT instead of TYPE_ALIGN_UNIT.
(ensure_base_align): Remove stmt_info parameter. Get the
target base alignment from DR_TARGET_ALIGNMENT.
(vectorizable_store): Update call accordingly. Interpret
DR_MISALIGNMENT relative to DR_TARGET_ALIGNMENT instead of
TYPE_ALIGN_UNIT.
(vectorizable_load): Likewise.
gcc/testsuite/
* gcc.dg/vect/vect-outer-3a.c: Adjust dump scan for new wording
of alignment message.
* gcc.dg/vect/vect-outer-3a-big-array.c: Likewise.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r253101
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 5d273ca..06224f9 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -790,7 +790,11 @@ STMT_VINFO_BB_VINFO (stmt_vec_info stmt_vinfo) #define STMT_SLP_TYPE(S) (S)->slp_type struct dataref_aux { + /* The misalignment in bytes of the reference, or -1 if not known. */ int misalignment; + /* The byte alignment that we'd ideally like the reference to have, + and the value that misalignment is measured against. */ + int target_alignment; /* If true the alignment of base_decl needs to be increased. */ bool base_misaligned; tree base_decl; @@ -1037,7 +1041,11 @@ dr_misalignment (struct data_reference *dr) #define SET_DR_MISALIGNMENT(DR, VAL) set_dr_misalignment (DR, VAL) #define DR_MISALIGNMENT_UNKNOWN (-1) -/* Return TRUE if the data access is aligned, and FALSE otherwise. */ +/* Only defined once DR_MISALIGNMENT is defined. */ +#define DR_TARGET_ALIGNMENT(DR) DR_VECT_AUX (DR)->target_alignment + +/* Return true if data access DR is aligned to its target alignment + (which may be less than a full vector). */ static inline bool aligned_access_p (struct data_reference *data_ref_info) @@ -1054,6 +1062,19 @@ known_alignment_for_access_p (struct data_reference *data_ref_info) return (DR_MISALIGNMENT (data_ref_info) != DR_MISALIGNMENT_UNKNOWN); } +/* Return the minimum alignment in bytes that the vectorized version + of DR is guaranteed to have. */ + +static inline unsigned int +vect_known_alignment_in_bytes (struct data_reference *dr) +{ + if (DR_MISALIGNMENT (dr) == DR_MISALIGNMENT_UNKNOWN) + return TYPE_ALIGN_UNIT (TREE_TYPE (DR_REF (dr))); + if (DR_MISALIGNMENT (dr) == 0) + return DR_TARGET_ALIGNMENT (dr); + return DR_MISALIGNMENT (dr) & -DR_MISALIGNMENT (dr); +} + /* Return the behavior of DR with respect to the vectorization context (which for outer loop vectorization might not be the behavior recorded in DR itself). */ |