Commit 8d21ff9f by Robin Dapp Committed by Andreas Krebbel

Vector peeling cost model 1/6

gcc/ChangeLog:

2017-05-30  Robin Dapp  <rdapp@linux.vnet.ibm.com>

	* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Create
	DR_HAS_NEGATIVE_STEP.
	(vect_update_misalignment_for_peel): Define DR_MISALIGNMENT.
	(vect_enhance_data_refs_alignment): Use.
	(vect_duplicate_ssa_name_ptr_info): Use.
	* tree-vectorizer.h (dr_misalignment): Use.
	(known_alignment_for_access_p): Use.

From-SVN: r248675
parent b3125625
2017-05-30 Robin Dapp <rdapp@linux.vnet.ibm.com>
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Create
DR_HAS_NEGATIVE_STEP.
(vect_update_misalignment_for_peel): Define DR_MISALIGNMENT.
(vect_enhance_data_refs_alignment): Use.
(vect_duplicate_ssa_name_ptr_info): Use.
* tree-vectorizer.h (dr_misalignment): Use.
(known_alignment_for_access_p): Use.
2017-05-30 Jozef Lawrynowicz <jozef.l@somniumtech.com> 2017-05-30 Jozef Lawrynowicz <jozef.l@somniumtech.com>
PR target/78838 PR target/78838
......
...@@ -717,7 +717,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr) ...@@ -717,7 +717,7 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
loop = LOOP_VINFO_LOOP (loop_vinfo); loop = LOOP_VINFO_LOOP (loop_vinfo);
/* Initialize misalignment to unknown. */ /* Initialize misalignment to unknown. */
SET_DR_MISALIGNMENT (dr, -1); SET_DR_MISALIGNMENT (dr, DR_MISALIGNMENT_UNKNOWN);
if (tree_fits_shwi_p (DR_STEP (dr))) if (tree_fits_shwi_p (DR_STEP (dr)))
misalign = DR_INIT (dr); misalign = DR_INIT (dr);
...@@ -957,8 +957,9 @@ vect_update_misalignment_for_peel (struct data_reference *dr, ...@@ -957,8 +957,9 @@ vect_update_misalignment_for_peel (struct data_reference *dr,
} }
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, "Setting misalignment to -1.\n"); dump_printf_loc (MSG_NOTE, vect_location, "Setting misalignment " \
SET_DR_MISALIGNMENT (dr, -1); "to unknown (-1).\n");
SET_DR_MISALIGNMENT (dr, DR_MISALIGNMENT_UNKNOWN);
} }
...@@ -1526,32 +1527,31 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) ...@@ -1526,32 +1527,31 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
{ {
if (known_alignment_for_access_p (dr)) if (known_alignment_for_access_p (dr))
{ {
unsigned int npeel_tmp; unsigned int npeel_tmp = 0;
bool negative = tree_int_cst_compare (DR_STEP (dr), bool negative = tree_int_cst_compare (DR_STEP (dr),
size_zero_node) < 0; size_zero_node) < 0;
/* Save info about DR in the hash table. */
vectype = STMT_VINFO_VECTYPE (stmt_info); vectype = STMT_VINFO_VECTYPE (stmt_info);
nelements = TYPE_VECTOR_SUBPARTS (vectype); nelements = TYPE_VECTOR_SUBPARTS (vectype);
mis = DR_MISALIGNMENT (dr) / GET_MODE_SIZE (TYPE_MODE ( mis = DR_MISALIGNMENT (dr) / GET_MODE_SIZE (TYPE_MODE (
TREE_TYPE (DR_REF (dr)))); TREE_TYPE (DR_REF (dr))));
npeel_tmp = (negative if (DR_MISALIGNMENT (dr) != 0)
? (mis - nelements) : (nelements - mis)) npeel_tmp = (negative ? (mis - nelements)
& (nelements - 1); : (nelements - mis)) & (nelements - 1);
/* For multiple types, it is possible that the bigger type access /* For multiple types, it is possible that the bigger type access
will have more than one peeling option. E.g., a loop with two will have more than one peeling option. E.g., a loop with two
types: one of size (vector size / 4), and the other one of types: one of size (vector size / 4), and the other one of
size (vector size / 8). Vectorization factor will 8. If both size (vector size / 8). Vectorization factor will 8. If both
access are misaligned by 3, the first one needs one scalar accesses are misaligned by 3, the first one needs one scalar
iteration to be aligned, and the second one needs 5. But the iteration to be aligned, and the second one needs 5. But the
first one will be aligned also by peeling 5 scalar first one will be aligned also by peeling 5 scalar
iterations, and in that case both accesses will be aligned. iterations, and in that case both accesses will be aligned.
Hence, except for the immediate peeling amount, we also want Hence, except for the immediate peeling amount, we also want
to try to add full vector size, while we don't exceed to try to add full vector size, while we don't exceed
vectorization factor. vectorization factor.
We do this automatically for cost model, since we calculate cost We do this automatically for cost model, since we calculate
for every peeling option. */ cost for every peeling option. */
if (unlimited_cost_model (LOOP_VINFO_LOOP (loop_vinfo))) if (unlimited_cost_model (LOOP_VINFO_LOOP (loop_vinfo)))
{ {
if (STMT_SLP_TYPE (stmt_info)) if (STMT_SLP_TYPE (stmt_info))
...@@ -1559,17 +1559,15 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) ...@@ -1559,17 +1559,15 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
= (vf * GROUP_SIZE (stmt_info)) / nelements; = (vf * GROUP_SIZE (stmt_info)) / nelements;
else else
possible_npeel_number = vf / nelements; possible_npeel_number = vf / nelements;
}
/* Handle the aligned case. We may decide to align some other /* NPEEL_TMP is 0 when there is no misalignment, increment
access, making DR unaligned. */ the peeling amount by one in order to ... */
if (DR_MISALIGNMENT (dr) == 0) if (DR_MISALIGNMENT (dr) == 0)
{
npeel_tmp = 0;
if (unlimited_cost_model (LOOP_VINFO_LOOP (loop_vinfo)))
possible_npeel_number++; possible_npeel_number++;
} }
/* Save info about DR in the hash table. Also include peeling
amounts according to the explanation above. */
for (j = 0; j < possible_npeel_number; j++) for (j = 0; j < possible_npeel_number; j++)
{ {
vect_peeling_hash_insert (&peeling_htab, loop_vinfo, vect_peeling_hash_insert (&peeling_htab, loop_vinfo,
...@@ -3884,7 +3882,7 @@ vect_duplicate_ssa_name_ptr_info (tree name, data_reference *dr, ...@@ -3884,7 +3882,7 @@ vect_duplicate_ssa_name_ptr_info (tree name, data_reference *dr,
duplicate_ssa_name_ptr_info (name, DR_PTR_INFO (dr)); duplicate_ssa_name_ptr_info (name, DR_PTR_INFO (dr));
unsigned int align = TYPE_ALIGN_UNIT (STMT_VINFO_VECTYPE (stmt_info)); unsigned int align = TYPE_ALIGN_UNIT (STMT_VINFO_VECTYPE (stmt_info));
int misalign = DR_MISALIGNMENT (dr); int misalign = DR_MISALIGNMENT (dr);
if (misalign == -1) if (misalign == DR_MISALIGNMENT_UNKNOWN)
mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name)); mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
else else
set_ptr_info_alignment (SSA_NAME_PTR_INFO (name), align, misalign); set_ptr_info_alignment (SSA_NAME_PTR_INFO (name), align, misalign);
......
...@@ -984,6 +984,7 @@ dr_misalignment (struct data_reference *dr) ...@@ -984,6 +984,7 @@ dr_misalignment (struct data_reference *dr)
taking into account peeling/versioning if applied. */ taking into account peeling/versioning if applied. */
#define DR_MISALIGNMENT(DR) dr_misalignment (DR) #define DR_MISALIGNMENT(DR) dr_misalignment (DR)
#define SET_DR_MISALIGNMENT(DR, VAL) set_dr_misalignment (DR, VAL) #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. */ /* Return TRUE if the data access is aligned, and FALSE otherwise. */
...@@ -999,7 +1000,7 @@ aligned_access_p (struct data_reference *data_ref_info) ...@@ -999,7 +1000,7 @@ aligned_access_p (struct data_reference *data_ref_info)
static inline bool static inline bool
known_alignment_for_access_p (struct data_reference *data_ref_info) known_alignment_for_access_p (struct data_reference *data_ref_info)
{ {
return (DR_MISALIGNMENT (data_ref_info) != -1); return (DR_MISALIGNMENT (data_ref_info) != DR_MISALIGNMENT_UNKNOWN);
} }
......
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