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)