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;