From a41a6142df74219f596e612d3a7775f68ca6e96f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 14 Sep 2017 16:35:39 +0000 Subject: 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 Alan Hayward David Sherwood 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. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r252766 --- gcc/tree-vectorizer.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'gcc/tree-vectorizer.h') diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 3807f60..57152ee 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) -- cgit v1.1