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;