diff options
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 91d3291..5466c78 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -480,14 +480,21 @@ is_a_helper <_bb_vec_info *>::test (vec_info *i) first level being indexed by nV - 1 (since nV == 0 doesn't exist) and the second being indexed by the mask index 0 <= i < nV. */ -/* The controls (like masks) needed by rgroups with nV vectors, +/* The controls (like masks or lengths) needed by rgroups with nV vectors, according to the description above. */ struct rgroup_controls { /* The largest nS for all rgroups that use these controls. */ unsigned int max_nscalars_per_iter; - /* The type of control to use, based on the highest nS recorded above. - For mask-based approach, it's used for mask_type. */ + /* For the largest nS recorded above, the loop controls divide each scalar + into FACTOR equal-sized pieces. This is useful if we need to split + element-based accesses into byte-based accesses. */ + unsigned int factor; + + /* This is a vector type with MAX_NSCALARS_PER_ITER * VF / nV elements. + For mask-based controls, it is the type of the masks in CONTROLS. + For length-based controls, it can be any vector type that has the + specified number of elements; the type of the elements doesn't matter. */ tree type; /* A vector of nV controls, in iteration order. */ @@ -496,6 +503,8 @@ struct rgroup_controls { typedef auto_vec<rgroup_controls> vec_loop_masks; +typedef auto_vec<rgroup_controls> vec_loop_lens; + typedef auto_vec<std::pair<data_reference*, tree> > drs_init_vec; /*-----------------------------------------------------------------*/ @@ -543,6 +552,10 @@ public: on inactive scalars. */ vec_loop_masks masks; + /* The lengths that a loop with length should use to avoid operating + on inactive scalars. */ + vec_loop_lens lens; + /* Set of scalar conditions that have loop mask applied. */ scalar_cond_masked_set_type scalar_cond_masked_set; @@ -651,6 +664,10 @@ public: the vector loop can handle fewer than VF scalars. */ bool using_partial_vectors_p; + /* True if we've decided to use partially-populated vectors for the + epilogue of loop. */ + bool epil_using_partial_vectors_p; + /* When we have grouped data accesses with gaps, we may introduce invalid memory accesses. We peel the last iteration of the loop to prevent this. */ @@ -714,9 +731,12 @@ public: #define LOOP_VINFO_VECTORIZABLE_P(L) (L)->vectorizable #define LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P(L) (L)->can_use_partial_vectors_p #define LOOP_VINFO_USING_PARTIAL_VECTORS_P(L) (L)->using_partial_vectors_p +#define LOOP_VINFO_EPIL_USING_PARTIAL_VECTORS_P(L) \ + (L)->epil_using_partial_vectors_p #define LOOP_VINFO_VECT_FACTOR(L) (L)->vectorization_factor #define LOOP_VINFO_MAX_VECT_FACTOR(L) (L)->max_vectorization_factor #define LOOP_VINFO_MASKS(L) (L)->masks +#define LOOP_VINFO_LENS(L) (L)->lens #define LOOP_VINFO_MASK_SKIP_NITERS(L) (L)->mask_skip_niters #define LOOP_VINFO_RGROUP_COMPARE_TYPE(L) (L)->rgroup_compare_type #define LOOP_VINFO_RGROUP_IV_TYPE(L) (L)->rgroup_iv_type @@ -754,6 +774,10 @@ public: (LOOP_VINFO_USING_PARTIAL_VECTORS_P (L) \ && !LOOP_VINFO_MASKS (L).is_empty ()) +#define LOOP_VINFO_FULLY_WITH_LENGTH_P(L) \ + (LOOP_VINFO_USING_PARTIAL_VECTORS_P (L) \ + && !LOOP_VINFO_LENS (L).is_empty ()) + #define LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT(L) \ ((L)->may_misalign_stmts.length () > 0) #define LOOP_REQUIRES_VERSIONING_FOR_ALIAS(L) \ @@ -1953,6 +1977,11 @@ extern void vect_record_loop_mask (loop_vec_info, vec_loop_masks *, unsigned int, tree, tree); extern tree vect_get_loop_mask (gimple_stmt_iterator *, vec_loop_masks *, unsigned int, tree, unsigned int); +extern void vect_record_loop_len (loop_vec_info, vec_loop_lens *, unsigned int, + tree, unsigned int); +extern tree vect_get_loop_len (loop_vec_info, vec_loop_lens *, unsigned int, + unsigned int); +extern gimple_seq vect_gen_len (tree, tree, tree, tree); extern stmt_vec_info info_for_reduction (vec_info *, stmt_vec_info); /* Drive for loop transformation stage. */ |