On Thu, Sep 14, 2017 at 1:24 PM, Richard Sandiford <richard.sandif...@linaro.org> wrote: > 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. > > Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu. > OK to install?
Ok. Richard. > Richard > > > 2017-09-14 Richard Sandiford <richard.sandif...@linaro.org> > Alan Hayward <alan.hayw...@arm.com> > David Sherwood <david.sherw...@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. > > Index: gcc/tree-vectorizer.h > =================================================================== > --- gcc/tree-vectorizer.h 2017-09-14 11:28:27.080519923 +0100 > +++ gcc/tree-vectorizer.h 2017-09-14 11:30:06.064254417 +0100 > @@ -241,6 +241,10 @@ typedef struct _loop_vec_info : public v > /* 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 @@ #define LOOP_VINFO_NITERS_ASSUMPTIONS(L) > #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 @@ #define LOOP_VINFO_NITERS_KNOWN_P(L) > #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) > Index: gcc/tree-vect-data-refs.c > =================================================================== > --- gcc/tree-vect-data-refs.c 2017-09-14 11:29:19.649870912 +0100 > +++ gcc/tree-vect-data-refs.c 2017-09-14 11:30:06.063347272 +0100 > @@ -509,7 +509,7 @@ vect_analyze_data_ref_dependences (loop_ > 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)) > Index: gcc/tree-vect-loop.c > =================================================================== > --- gcc/tree-vect-loop.c 2017-09-14 11:28:27.079519923 +0100 > +++ gcc/tree-vect-loop.c 2017-09-14 11:30:06.064254417 +0100 > @@ -1111,6 +1111,7 @@ _loop_vec_info::_loop_vec_info (struct l > 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_ > "bad data dependence.\n"); > return false; > } > + LOOP_VINFO_MAX_VECT_FACTOR (loop_vinfo) = max_vf; > > ok = vect_determine_vectorization_factor (loop_vinfo); > if (!ok)