On Fri, May 20, 2016 at 11:50 AM, Ilya Enkovich <enkovich....@gmail.com> wrote:
> 2016-05-20 12:26 GMT+03:00 Richard Biener <richard.guent...@gmail.com>:
>> 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?
>
> I don't expect casual user to decide which modes to choose.  These controls 
> are
> added for debugging and performance measurement purposes.  I see now I miss
> -ftree-vectorize-epilogues aliased to -ftree-vectorize-epilogues=all.  Surely
> I expect epilogues and short loops vectorization be enabled by default on -O3
> or by -ftree-vectorize-loops.

Can you make all these --params then?  I think to be useful to users we'd want
them to be loop pragmas rather than options.

Richard.

> Thanks,
> Ilya
>
>>
>> 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