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? 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;