On Thu, Jun 9, 2016 at 12:36 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > Hi Richard, > > Do you have some comments on other parts of this series?
It's queued for review ... I'll need a slot of some spare hours to go over it. Richard. > Thanks, > Ilya > > 2016-05-20 14:40 GMT+03:00 Ilya Enkovich <enkovich....@gmail.com>: >> 2016-05-20 14:17 GMT+03:00 Richard Biener <richard.guent...@gmail.com>: >>> 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. >> >> OK, I'll change it to params. I didn't think about control via >> pragmas but will do now. >> >> Thanks, >> Ilya >> >>> >>> 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;