Hi, This patch introduces new options used for loop epilogues vectorization.
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;