Hi,

This patch adds new fields to _loop_vec_info structure to support loop
epilogue vectorization.

Thanks,
Ilya
--
gcc/

2016-05-19  Ilya Enkovich  <ilya.enkov...@intel.com>

        * tree-vectorizer.h (struct _loop_vec_info): Add new fields
        can_be_masked, required_masks, mask_epilogue, combine_epilogue,
        need_masking, orig_loop_info.
        (LOOP_VINFO_CAN_BE_MASKED): New.
        (LOOP_VINFO_REQUIRED_MASKS): New.
        (LOOP_VINFO_COMBINE_EPILOGUE): New.
        (LOOP_VINFO_MASK_EPILOGUE): New.
        (LOOP_VINFO_NEED_MASKING): New.
        (LOOP_VINFO_ORIG_LOOP_INFO): New.
        (LOOP_VINFO_EPILOGUE_P): New.
        (LOOP_VINFO_ORIG_MASK_EPILOGUE): New.
        (LOOP_VINFO_ORIG_VECT_FACTOR): New.
        * tree-vect-loop.c (new_loop_vec_info): Initialize new
        _loop_vec_info fields.


diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index da98211..aac0df9 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -1125,6 +1125,12 @@ new_loop_vec_info (struct loop *loop)
   LOOP_VINFO_PEELING_FOR_GAPS (res) = false;
   LOOP_VINFO_PEELING_FOR_NITER (res) = false;
   LOOP_VINFO_OPERANDS_SWAPPED (res) = false;
+  LOOP_VINFO_CAN_BE_MASKED (res) = false;
+  LOOP_VINFO_REQUIRED_MASKS (res) = 0;
+  LOOP_VINFO_COMBINE_EPILOGUE (res) = false;
+  LOOP_VINFO_MASK_EPILOGUE (res) = false;
+  LOOP_VINFO_NEED_MASKING (res) = false;
+  LOOP_VINFO_ORIG_LOOP_INFO (res) = NULL;
 
   return res;
 }
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index bd1d55a..4c19317 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -336,6 +336,23 @@ typedef struct _loop_vec_info : public vec_info {
   /* Mark loops having masked stores.  */
   bool has_mask_store;
 
+  /* True if vectorized loop can be masked.  */
+  bool can_be_masked;
+  /* If vector mask with 2^N elements is required to mask the loop
+     then N-th bit of this field is set to 1.  */
+  unsigned required_masks;
+
+  /* True if we should vectorize loop epilogue with masking.  */
+  bool mask_epilogue;
+  /* True if we should combine main loop with epilogue using masking.  */
+  bool combine_epilogue;
+  /* True if loop vectorization requires masking.  E.g. we want to
+     vectorize loop with low trip count.  */
+  bool need_masking;
+  /* For loops being epilogues of already vectorized loops
+     this points to the original vectorized loop.  Otherwise NULL.  */
+  _loop_vec_info *orig_loop_info;
+
 } *loop_vec_info;
 
 /* Access Functions.  */
@@ -374,6 +391,12 @@ typedef struct _loop_vec_info : public vec_info {
 #define LOOP_VINFO_HAS_MASK_STORE(L)       (L)->has_mask_store
 #define LOOP_VINFO_SCALAR_ITERATION_COST(L) (L)->scalar_cost_vec
 #define LOOP_VINFO_SINGLE_SCALAR_ITERATION_COST(L) 
(L)->single_scalar_iteration_cost
+#define LOOP_VINFO_CAN_BE_MASKED(L)        (L)->can_be_masked
+#define LOOP_VINFO_REQUIRED_MASKS(L)       (L)->required_masks
+#define LOOP_VINFO_COMBINE_EPILOGUE(L)     (L)->combine_epilogue
+#define LOOP_VINFO_MASK_EPILOGUE(L)        (L)->mask_epilogue
+#define LOOP_VINFO_NEED_MASKING(L)         (L)->need_masking
+#define LOOP_VINFO_ORIG_LOOP_INFO(L)       (L)->orig_loop_info
 
 #define LOOP_REQUIRES_VERSIONING_FOR_ALIGNMENT(L) \
   ((L)->may_misalign_stmts.length () > 0)
@@ -383,6 +406,14 @@ typedef struct _loop_vec_info : public vec_info {
 #define LOOP_VINFO_NITERS_KNOWN_P(L)          \
   (tree_fits_shwi_p ((L)->num_iters) && tree_to_shwi ((L)->num_iters) > 0)
 
+#define LOOP_VINFO_EPILOGUE_P(L) \
+  (LOOP_VINFO_ORIG_LOOP_INFO(L) != NULL)
+
+#define LOOP_VINFO_ORIG_MASK_EPILOGUE(L) \
+  (LOOP_VINFO_MASK_EPILOGUE (LOOP_VINFO_ORIG_LOOP_INFO(L)))
+#define LOOP_VINFO_ORIG_VECT_FACTOR(L) \
+  (LOOP_VINFO_VECT_FACTOR (LOOP_VINFO_ORIG_LOOP_INFO(L)))
+
 static inline loop_vec_info
 loop_vec_info_for_loop (struct loop *loop)
 {

Reply via email to