diff options
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 2 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 2 | ||||
-rw-r--r-- | gcc/tree-vectorizer.h | 9 |
4 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c3ab19a..31c9d0a 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 a696979..c409dc7 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 f0eafc5..80eb4f1 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 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) |