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.

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