<p dir="ltr">At a quick glance Os and Oz should probably map to O2. </p>
<br><div class="gmail_quote"><div dir="ltr">On Mon, Jan 18, 2016, 4:19 PM Justin Lebar <<a href="mailto:jlebar@google.com">jlebar@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">jlebar created this revision.<br>
jlebar added a reviewer: tra.<br>
jlebar added subscribers: jhen, echristo, cfe-commits.<br>
<br>
Previously we'd crash the driver if you passed -O0.  Now we try to<br>
handle all of clang's various optimization flags in a sane way.<br>
<br>
<a href="http://reviews.llvm.org/D16307" rel="noreferrer" target="_blank">http://reviews.llvm.org/D16307</a><br>
<br>
Files:<br>
  lib/Driver/Tools.cpp<br>
  test/Driver/<a href="http://cuda-external-tools.cu" rel="noreferrer" target="_blank">cuda-external-tools.cu</a><br>
<br>
Index: test/Driver/<a href="http://cuda-external-tools.cu" rel="noreferrer" target="_blank">cuda-external-tools.cu</a><br>
===================================================================<br>
--- test/Driver/<a href="http://cuda-external-tools.cu" rel="noreferrer" target="_blank">cuda-external-tools.cu</a><br>
+++ test/Driver/<a href="http://cuda-external-tools.cu" rel="noreferrer" target="_blank">cuda-external-tools.cu</a><br>
@@ -4,14 +4,31 @@<br>
 // REQUIRES: x86-registered-target<br>
 // REQUIRES: nvptx-registered-target<br>
<br>
-// Regular compile with -O2.<br>
+// Regular compiles with -O{0,1,2,3,4,fast}.  -O4 and -Ofast map to ptxas O3.<br>
+// RUN: %clang -### -target x86_64-linux-gnu -O0 -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT0 %s<br>
+// RUN: %clang -### -target x86_64-linux-gnu -O1 -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT1 %s<br>
 // RUN: %clang -### -target x86_64-linux-gnu -O2 -c %s 2>&1 \<br>
 // RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT2 %s<br>
+// RUN: %clang -### -target x86_64-linux-gnu -O3 -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT3 %s<br>
+// RUN: %clang -### -target x86_64-linux-gnu -O4 -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT3 %s<br>
+// RUN: %clang -### -target x86_64-linux-gnu -Ofast -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT3 %s<br>
<br>
 // Regular compile without -O.  This should result in us passing -O0 to ptxas.<br>
 // RUN: %clang -### -target x86_64-linux-gnu -c %s 2>&1 \<br>
 // RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT0 %s<br>
<br>
+// Regular compiles with -Os and -Oz.  For lack of a better option, we map<br>
+// these to ptxas -O3.<br>
+// RUN: %clang -### -target x86_64-linux-gnu -Os -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT3 %s<br>
+// RUN: %clang -### -target x86_64-linux-gnu -Oz -c %s 2>&1 \<br>
+// RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM20 -check-prefix OPT3 %s<br>
+<br>
 // Regular compile targeting sm_35.<br>
 // RUN: %clang -### -target x86_64-linux-gnu --cuda-gpu-arch=sm_35 -c %s 2>&1 \<br>
 // RUN: | FileCheck -check-prefix ARCH64 -check-prefix SM35 %s<br>
@@ -42,7 +59,9 @@<br>
 // ARCH64: "-m64"<br>
 // ARCH32: "-m32"<br>
 // OPT0: "-O0"<br>
+// OPT1: "-O1"<br>
 // OPT2: "-O2"<br>
+// OPT3: "-O3"<br>
 // SM20: "--gpu-name" "sm_20"<br>
 // SM35: "--gpu-name" "sm_35"<br>
 // SM20: "--output-file" "[[CUBINFILE:[^"]*]]"<br>
Index: lib/Driver/Tools.cpp<br>
===================================================================<br>
--- lib/Driver/Tools.cpp<br>
+++ lib/Driver/Tools.cpp<br>
@@ -10645,10 +10645,34 @@<br>
   ArgStringList CmdArgs;<br>
   CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");<br>
<br>
-  // Clang's default optimization level is -O0, but ptxas's default is -O3.<br>
-  CmdArgs.push_back(Args.MakeArgString(<br>
-      llvm::Twine("-O") +<br>
-      Args.getLastArgValue(options::OPT_O_Group, "0").data()));<br>
+  // Map the -O we received to -O{0,1,2,3}.<br>
+  //<br>
+  // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's default,<br>
+  // so it may correspond more closely to the spirit of clang -O2.<br>
+  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {<br>
+    // -O3 seems like the least-bad option when -Osomething is specified to<br>
+    // clang but it isn't handled above.<br>
+    StringRef OOpt = "3";<br>
+    if (A->getOption().matches(options::OPT_O4) ||<br>
+        A->getOption().matches(options::OPT_Ofast))<br>
+      OOpt = "3";<br>
+    else if (A->getOption().matches(options::OPT_O0))<br>
+      OOpt = "0";<br>
+    else if (A->getOption().matches(options::OPT_O)) {<br>
+      // -Os, -Oz, and -O(anything else) map to -O3, for lack of better options.<br>
+      OOpt = llvm::StringSwitch<const char *>(A->getValue())<br>
+                 .Case("1", "1")<br>
+                 .Case("2", "2")<br>
+                 .Case("s", "3")<br>
+                 .Case("z", "3")<br>
+                 .Default("3");<br>
+    }<br>
+    CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));<br>
+  } else {<br>
+    // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond<br>
+    // to no optimizations, but ptxas's default is -O3.<br>
+    CmdArgs.push_back("-O0");<br>
+  }<br>
<br>
   // Don't bother passing -g to ptxas: It's enabled by default at -O0, and<br>
   // not supported at other optimization levels.<br>
<br>
<br>
</blockquote></div>