diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-07-03 13:36:45 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-07-03 13:36:45 +0000 |
commit | 832b4117d4068670cc9ed496a7ab06104a12dc00 (patch) | |
tree | 212a6cb0ef5981580051a51ecd93ab60de8b92c8 /gcc/tree-vect-data-refs.c | |
parent | e054a1852bf903139a80f34c726453d34338e008 (diff) | |
download | gcc-832b4117d4068670cc9ed496a7ab06104a12dc00.zip gcc-832b4117d4068670cc9ed496a7ab06104a12dc00.tar.gz gcc-832b4117d4068670cc9ed496a7ab06104a12dc00.tar.bz2 |
Add DR_STEP_ALIGNMENT
A later patch adds base alignment information to innermost_loop_behavior.
After that, the only remaining piece of alignment information that wasn't
immediately obvious was the step alignment. Adding that allows a minor
simplification to vect_compute_data_ref_alignment, and also potentially
improves the handling of variable strides for outer loop vectorisation.
A later patch will also use it to give the alignment of the DR as a whole.
2017-07-03 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
* tree-data-ref.h (innermost_loop_behavior): Add a step_alignment
field.
(DR_STEP_ALIGNMENT): New macro.
* tree-vectorizer.h (STMT_VINFO_DR_STEP_ALIGNMENT): Likewise.
* tree-data-ref.c (dr_analyze_innermost): Initalize step_alignment.
(create_data_ref): Print it.
* tree-vect-stmts.c (vectorizable_load): Use the step alignment
to tell whether the step preserves vector (mis)alignment.
* tree-vect-data-refs.c (vect_compute_data_ref_alignment): Likewise.
Move the check for an integer step and generalise to all INTEGER_CST.
(vect_analyze_data_refs): Set DR_STEP_ALIGNMENT when setting DR_STEP.
Print the outer step alignment.
From-SVN: r249915
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 091771c..9ee53ec 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -698,10 +698,9 @@ vect_compute_data_ref_alignment (struct data_reference *dr) divides by the vector size. */ else if (nested_in_vect_loop_p (loop, stmt)) { - tree step = DR_STEP (dr); step_preserves_misalignment_p - = (tree_fits_shwi_p (step) - && tree_to_shwi (step) % GET_MODE_SIZE (TYPE_MODE (vectype)) == 0); + = (DR_STEP_ALIGNMENT (dr) + % GET_MODE_SIZE (TYPE_MODE (vectype))) == 0; if (dump_enabled_p ()) { @@ -720,12 +719,10 @@ vect_compute_data_ref_alignment (struct data_reference *dr) the dataref evenly divides by the vector size. */ else { - tree step = DR_STEP (dr); unsigned vf = LOOP_VINFO_VECT_FACTOR (loop_vinfo); step_preserves_misalignment_p - = (tree_fits_shwi_p (step) - && ((tree_to_shwi (step) * vf) - % GET_MODE_SIZE (TYPE_MODE (vectype)) == 0)); + = ((DR_STEP_ALIGNMENT (dr) * vf) + % GET_MODE_SIZE (TYPE_MODE (vectype))) == 0; if (!step_preserves_misalignment_p && dump_enabled_p ()) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, @@ -773,7 +770,10 @@ vect_compute_data_ref_alignment (struct data_reference *dr) alignment = TYPE_ALIGN_UNIT (vectype); if (drb->offset_alignment < alignment - || !step_preserves_misalignment_p) + || !step_preserves_misalignment_p + /* We need to know whether the step wrt the vectorized loop is + negative when computing the starting misalignment below. */ + || TREE_CODE (drb->step) != INTEGER_CST) { if (dump_enabled_p ()) { @@ -3414,6 +3414,8 @@ again: DR_STEP (newdr) = step; DR_OFFSET_ALIGNMENT (newdr) = BIGGEST_ALIGNMENT; + DR_STEP_ALIGNMENT (newdr) + = highest_pow2_factor (step); dr = newdr; simd_lane_access = true; } @@ -3665,6 +3667,8 @@ again: STMT_VINFO_DR_STEP (stmt_info)); dump_printf (MSG_NOTE, "\n\touter offset alignment: %d\n", STMT_VINFO_DR_OFFSET_ALIGNMENT (stmt_info)); + dump_printf (MSG_NOTE, "\n\touter step alignment: %d\n", + STMT_VINFO_DR_STEP_ALIGNMENT (stmt_info)); } } |