Hi,

This patch introduces new options used for loop epilogues vectorization.

Thanks,
Ilya
--
gcc/

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

        * common.opt (flag_tree_vectorize_epilogues): New.
        (ftree-vectorize-short-loops): New.
        (ftree-vectorize-epilogues=): New.
        (fno-tree-vectorize-epilogues): New.
        (fvect-epilogue-cost-model=): New.
        * flag-types.h (enum vect_epilogue_mode): New.
        * opts.c (parse_vectorizer_options): New.
        (common_handle_option): Support -ftree-vectorize-epilogues=
        and -fno-tree-vectorize-epilogues options.


diff --git a/gcc/common.opt b/gcc/common.opt
index 682cb41..6b83b79 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -243,6 +243,10 @@ bool dump_base_name_prefixed = false
 Variable
 bool flag_disable_hsa = false
 
+; Flag holding modes for loop epilogue vectorization
+Variable
+unsigned int flag_tree_vectorize_epilogues
+
 ###
 Driver
 
@@ -2557,6 +2561,19 @@ ftree-vectorize
 Common Report Var(flag_tree_vectorize) Optimization
 Enable vectorization on trees.
 
+ftree-vectorize-short-loops
+Common Report Var(flag_tree_vectorize_short_loops) Optimization
+Enable vectorization of loops with low trip count using masking.
+
+ftree-vectorize-epilogues=
+Common Report Joined Optimization
+Comma separated list of loop epilogue vectorization modes.
+Available modes: combine, mask, nomask.
+
+fno-tree-vectorize-epilogues
+Common RejectNegative Optimization
+Disable epilogues vectorization.
+
 ftree-vectorizer-verbose=
 Common Joined RejectNegative Ignore
 Does nothing.  Preserved for backward compatibility.
@@ -2577,6 +2594,10 @@ fsimd-cost-model=
 Common Joined RejectNegative Enum(vect_cost_model) Var(flag_simd_cost_model) 
Init(VECT_COST_MODEL_UNLIMITED) Optimization
 Specifies the vectorization cost model for code marked with a simd directive.
 
+fvect-epilogue-cost-model=
+Common Joined RejectNegative Enum(vect_cost_model) 
Var(flag_vect_epilogue_cost_model) Init(VECT_COST_MODEL_DEFAULT) Optimization
+Specifies the cost model for epilogue vectorization.
+
 Enum
 Name(vect_cost_model) Type(enum vect_cost_model) UnknownError(unknown 
vectorizer cost model %qs)
 
diff --git a/gcc/flag-types.h b/gcc/flag-types.h
index dd57e16..24081b1 100644
--- a/gcc/flag-types.h
+++ b/gcc/flag-types.h
@@ -200,6 +200,15 @@ enum vect_cost_model {
   VECT_COST_MODEL_DEFAULT = 3
 };
 
+/* Epilogue vectorization modes.  */
+enum vect_epilogue_mode {
+  VECT_EPILOGUE_COMBINE = 1 << 0,
+  VECT_EPILOGUE_MASK = 1 << 1,
+  VECT_EPILOGUE_NOMASK = 1 << 2,
+  VECT_EPILOGUE_ALL = VECT_EPILOGUE_COMBINE | VECT_EPILOGUE_MASK
+                     | VECT_EPILOGUE_NOMASK
+};
+
 /* Different instrumentation modes.  */
 enum sanitize_code {
   /* AddressSanitizer.  */
diff --git a/gcc/opts.c b/gcc/opts.c
index 0f9431a..a0c0987 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1531,6 +1531,63 @@ parse_sanitizer_options (const char *p, location_t loc, 
int scode,
   return flags;
 }
 
+/* Parse comma separated vectorizer suboptions from P for option SCODE,
+   adjust previous FLAGS and return new ones.  If COMPLAIN is false,
+   don't issue diagnostics.  */
+
+unsigned int
+parse_vectorizer_options (const char *p, location_t loc, int scode,
+                         unsigned int flags, int value, bool complain)
+{
+  if (scode != OPT_ftree_vectorize_epilogues_)
+    return flags;
+
+  if (!p)
+    return value;
+
+  while (*p != 0)
+    {
+      size_t len;
+      const char *comma = strchr (p, ',');
+      unsigned int flag = 0;
+
+      if (comma == NULL)
+       len = strlen (p);
+      else
+       len = comma - p;
+      if (len == 0)
+       {
+         p = comma + 1;
+         continue;
+       }
+
+      /* Check to see if the string matches an option class name.  */
+      if (len == strlen ("combine")
+         && memcmp (p, "combine", len) == 0)
+       flag = VECT_EPILOGUE_COMBINE;
+      else if (len == strlen ("mask")
+         && memcmp (p, "mask", len) == 0)
+       flag = VECT_EPILOGUE_MASK;
+      else if (len == strlen ("nomask")
+         && memcmp (p, "nomask", len) == 0)
+       flag = VECT_EPILOGUE_NOMASK;
+      else if (complain)
+       error_at (loc, "unrecognized argument to -ftree-vectorize-epilogues= "
+                 "option: %q.*s", (int) len, p);
+
+      if (value)
+       flags |= flag;
+      else
+       flags &= ~flag;
+
+      if (comma == NULL)
+       break;
+      p = comma + 1;
+    }
+
+  return flags;
+}
+
 /* Handle target- and language-independent options.  Return zero to
    generate an "unknown option" message.  Only options that need
    extra handling need to be listed here; if you simply want
@@ -2018,6 +2075,18 @@ common_handle_option (struct gcc_options *opts,
       if (!opts_set->x_flag_tree_slp_vectorize)
         opts->x_flag_tree_slp_vectorize = value;
       break;
+
+    case OPT_ftree_vectorize_epilogues_:
+      opts->x_flag_tree_vectorize_epilogues
+       = parse_vectorizer_options (arg, loc, code,
+                                   opts->x_flag_tree_vectorize_epilogues,
+                                   value, true);
+      break;
+
+    case OPT_fno_tree_vectorize_epilogues:
+      opts->x_flag_tree_vectorize_epilogues = 0;
+      break;
+
     case OPT_fshow_column:
       dc->show_column = value;
       break;

Reply via email to