aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-09-14 16:35:39 +0000
committerRichard Sandiford <richard.sandiford@linaro.org>2017-09-14 16:35:39 +0000
commitfe2875ca7dc5590007e22767dc95ffed3b1d0fe4 (patch)
tree55832f96a9e8fb31f553b1284c5fdc4d0dac5104
parentf7b656d21befd8d121301559366676be1a1a5e02 (diff)
Add LOOP_VINFO_MAX_VECT_FACTOR
Epilogue vectorisation uses the vectorisation factor of the main loop as the maximum vectorisation factor allowed for correctness. That makes sense as a conservatively correct value, since the chosen vectorisation factor will be strictly less than that anyway. However, once the VF itself becomes variable, it's easier to carry across the original maximum VF instead. 2017-09-14 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vectorizer.h (_loop_vec_info): Add max_vectorization_factor. (LOOP_VINFO_MAX_VECT_FACTOR): New macro. (LOOP_VINFO_ORIG_VECT_FACTOR): Replace with... (LOOP_VINFO_ORIG_MAX_VECT_FACTOR): ...this new macro. * tree-vect-data-refs.c (vect_analyze_data_ref_dependences): Update accordingly. * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize max_vectorization_factor. (vect_analyze_loop_2): Set LOOP_VINFO_MAX_VECT_FACTOR. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@252766 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/tree-vect-data-refs.c2
-rw-r--r--gcc/tree-vect-loop.c2
-rw-r--r--gcc/tree-vectorizer.h9
4 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3ab19aa7da..31c9d0afb2b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,20 @@
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
+ * tree-vectorizer.h (_loop_vec_info): Add max_vectorization_factor.
+ (LOOP_VINFO_MAX_VECT_FACTOR): New macro.
+ (LOOP_VINFO_ORIG_VECT_FACTOR): Replace with...
+ (LOOP_VINFO_ORIG_MAX_VECT_FACTOR): ...this new macro.
+ * tree-vect-data-refs.c (vect_analyze_data_ref_dependences): Update
+ accordingly.
+ * tree-vect-loop.c (_loop_vec_info::_loop_vec_info): Initialize
+ max_vectorization_factor.
+ (vect_analyze_loop_2): Set LOOP_VINFO_MAX_VECT_FACTOR.
+
+2017-09-14 Richard Sandiford <richard.sandiford@linaro.org>
+ Alan Hayward <alan.hayward@arm.com>
+ David Sherwood <david.sherwood@arm.com>
+
* tree-vectorizer.h (vect_min_worthwhile_factor): Delete.
(vect_worthwhile_without_simd_p): Declare.
* tree-vect-loop.c (vect_worthwhile_without_simd_p): New function.
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index a6969791bb2..c409dc71a49 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -509,7 +509,7 @@ vect_analyze_data_ref_dependences (loop_vec_info loop_vinfo, int *max_vf)
was applied to original loop. Therefore we may just get max_vf
using VF of original loop. */
if (LOOP_VINFO_EPILOGUE_P (loop_vinfo))
- *max_vf = LOOP_VINFO_ORIG_VECT_FACTOR (loop_vinfo);
+ *max_vf = LOOP_VINFO_ORIG_MAX_VECT_FACTOR (loop_vinfo);
else
FOR_EACH_VEC_ELT (LOOP_VINFO_DDRS (loop_vinfo), i, ddr)
if (vect_analyze_data_ref_dependence (ddr, loop_vinfo, max_vf))
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index f0eafc58504..80eb4f1fda9 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -1111,6 +1111,7 @@ _loop_vec_info::_loop_vec_info (struct loop *loop_in)
num_iters_assumptions (NULL_TREE),
th (0),
vectorization_factor (0),
+ max_vectorization_factor (0),
unaligned_dr (NULL),
peeling_for_alignment (0),
ptr_mask (0),
@@ -1920,6 +1921,7 @@ vect_analyze_loop_2 (loop_vec_info loop_vinfo, bool &fatal)
"bad data dependence.\n");
return false;
}
+ LOOP_VINFO_MAX_VECT_FACTOR (loop_vinfo) = max_vf;
ok = vect_determine_vectorization_factor (loop_vinfo);
if (!ok)
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 3807f60680f..57152ee08b1 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -241,6 +241,10 @@ typedef struct _loop_vec_info : public vec_info {
/* Unrolling factor */
int vectorization_factor;
+ /* Maximum runtime vectorization factor, or MAX_VECTORIZATION_FACTOR
+ if there is no particular limit. */
+ unsigned HOST_WIDE_INT max_vectorization_factor;
+
/* Unknown DRs according to which loop was peeled. */
struct data_reference *unaligned_dr;
@@ -355,6 +359,7 @@ typedef struct _loop_vec_info : public vec_info {
#define LOOP_VINFO_COST_MODEL_THRESHOLD(L) (L)->th
#define LOOP_VINFO_VECTORIZABLE_P(L) (L)->vectorizable
#define LOOP_VINFO_VECT_FACTOR(L) (L)->vectorization_factor
+#define LOOP_VINFO_MAX_VECT_FACTOR(L) (L)->max_vectorization_factor
#define LOOP_VINFO_PTR_MASK(L) (L)->ptr_mask
#define LOOP_VINFO_LOOP_NEST(L) (L)->loop_nest
#define LOOP_VINFO_DATAREFS(L) (L)->datarefs
@@ -400,8 +405,8 @@ typedef struct _loop_vec_info : public vec_info {
#define LOOP_VINFO_EPILOGUE_P(L) \
(LOOP_VINFO_ORIG_LOOP_INFO (L) != NULL)
-#define LOOP_VINFO_ORIG_VECT_FACTOR(L) \
- (LOOP_VINFO_VECT_FACTOR (LOOP_VINFO_ORIG_LOOP_INFO (L)))
+#define LOOP_VINFO_ORIG_MAX_VECT_FACTOR(L) \
+ (LOOP_VINFO_MAX_VECT_FACTOR (LOOP_VINFO_ORIG_LOOP_INFO (L)))
static inline loop_vec_info
loop_vec_info_for_loop (struct loop *loop)