[driver] Enable the slp vectorizer at -Oz.
PR19568
llvm-svn: 207858
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index bec557b..fe0b727 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -2146,7 +2146,8 @@
}
/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
-static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) {
+/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
+static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
if (A->getOption().matches(options::OPT_O4) ||
A->getOption().matches(options::OPT_Ofast))
@@ -2162,9 +2163,9 @@
if (S == "s")
return true;
- // Don't vectorize -Oz.
+ // Don't vectorize -Oz, unless it's the slp vectorizer.
if (S == "z")
- return false;
+ return isSlpVec;
unsigned OptLevel = 0;
if (S.getAsInteger(10, OptLevel))
@@ -3900,7 +3901,7 @@
// Enable vectorization per default according to the optimization level
// selected. For optimization levels that want vectorization we use the alias
// option to simplify the hasFlag logic.
- bool EnableVec = shouldEnableVectorizerAtOLevel(Args);
+ bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
options::OPT_fvectorize;
if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
@@ -3908,10 +3909,11 @@
CmdArgs.push_back("-vectorize-loops");
// -fslp-vectorize is enabled based on the optimization level selected.
- OptSpecifier SLPVectAliasOption = EnableVec ? options::OPT_O_Group :
+ bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
+ OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
options::OPT_fslp_vectorize;
if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
- options::OPT_fno_slp_vectorize, EnableVec))
+ options::OPT_fno_slp_vectorize, EnableSLPVec))
CmdArgs.push_back("-vectorize-slp");
// -fno-slp-vectorize-aggressive is default.