On Thu, May 19, 2016 at 9:36 PM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> Hi,
>
> This patch introduces new options used for loop epilogues vectorization.

Why's that?  This is a bit too much for the casual user and if it is
really necessary
to control this via options then it is not fine-grained enough.

Why doesn't the vectorizer/backend have enough info to decide this itself?

Richard.

> 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