aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)