diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3ab19aa7da67a1ddb2418add9db87417980e1cc..31c9d0afb2b25806fa06340476ac554dfc428a73 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
+	    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>
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index a6969791bb2e181ca5aa6920dc756bc82479c0db..c409dc71a49ec6e55fcf6199304aec3017c7afb3 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 f0eafc58504e546a35a3e46c8a3d55a2f7fa8339..80eb4f1fda9734935f87cd7610a63861c1d21430 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 3807f60680f165be0770105a949d542bf4423232..57152ee08b14405c145fa5a5f98dcd54e4ee2535 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)