If -fslp-vectorize or -fno-slp-vectorize are given, honor this selection. If no flag...
authorNadav Rotem <nrotem@apple.com>
Thu, 1 Aug 2013 22:56:53 +0000 (22:56 +0000)
committerNadav Rotem <nrotem@apple.com>
Thu, 1 Aug 2013 22:56:53 +0000 (22:56 +0000)
llvm-svn: 187630

clang/lib/Driver/Tools.cpp

index 3a23732..b6f6c3d 100644 (file)
@@ -1974,6 +1974,12 @@ static bool isOptimizationLevelFast(const ArgList &Args) {
   return false;
 }
 
+static bool isOptimizationLevel3(const ArgList &Args) {
+  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
+    return StringRef(A->getValue()).equals("3");
+  return false;
+}
+
 void Clang::ConstructJob(Compilation &C, const JobAction &JA,
                          const InputInfo &Output,
                          const InputInfoList &Inputs,
@@ -3452,9 +3458,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
                    options::OPT_fno_vectorize, true))
     CmdArgs.push_back("-vectorize-loops");
 
-  // -fslp-vectorize is default.
-  if (Args.hasFlag(options::OPT_fslp_vectorize,
-                   options::OPT_fno_slp_vectorize, true))
+  bool EnableSLP = false;
+  // If -fslp-vectorize or -fno-slp-vectorize are given, honor this selection.
+  if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize,
+                      options::OPT_fno_slp_vectorize)) {
+    EnableSLP = A->getOption().matches(options::OPT_fslp_vectorize);
+  } else {
+    // Also enable SLP vectorization on O3 or OFast
+    EnableSLP = isOptimizationLevel3(Args) || isOptimizationLevelFast(Args);
+  }
+
+  if (EnableSLP)
     CmdArgs.push_back("-vectorize-slp");
 
   // -fno-slp-vectorize-aggressive is default.