<div dir="ltr"><div class="gmail_default" style="font-family:courier new,monospace;font-size:small">Hi Hans,</div><div class="gmail_default" style="font-family:courier new,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:courier new,monospace;font-size:small">Can we have this for the 6.0 branch? I'm also going to send a patch to add the release notes clang and LLVM about this flag and GISel being enabled at -O0.</div><div class="gmail_default" style="font-family:courier new,monospace;font-size:small"><br></div><div class="gmail_default" style="font-family:courier new,monospace;font-size:small">Cheers,</div><div class="gmail_default" style="font-family:courier new,monospace;font-size:small">Amara</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 25 January 2018 at 16:27, Amara Emerson via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: aemerson<br>
Date: Thu Jan 25 16:27:22 2018<br>
New Revision: 323485<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=323485&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=323485&view=rev</a><br>
Log:<br>
[Driver] Add an -fexperimental-isel driver option to enable/disable GlobalISel.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D42276" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D42276</a><br>
<br>
Added:<br>
    cfe/trunk/test/Driver/global-<wbr>isel.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>DiagnosticDriverKinds.td<br>
    cfe/trunk/include/clang/Basic/<wbr>DiagnosticGroups.td<br>
    cfe/trunk/include/clang/<wbr>Driver/Options.td<br>
    cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>DiagnosticDriverKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=323485&r1=323484&r2=323485&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/<wbr>DiagnosticDriverKinds.td?rev=<wbr>323485&r1=323484&r2=323485&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>DiagnosticDriverKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>DiagnosticDriverKinds.td Thu Jan 25 16:27:22 2018<br>
@@ -361,4 +361,12 @@ def warn_drv_fine_grained_<wbr>bitfield_acces<br>
 def note_drv_verify_prefix_<wbr>spelling : Note<<br>
   "-verify prefixes must start with a letter and contain only alphanumeric"<br>
   " characters, hyphens, and underscores">;<br>
+<br>
+def warn_drv_experimental_isel_<wbr>incomplete : Warning<<br>
+  "-fexperimental-isel support for the '%0' architecture is incomplete">,<br>
+  InGroup<ExperimentalISel>;<br>
+<br>
+def warn_drv_experimental_isel_<wbr>incomplete_opt : Warning<<br>
+  "-fexperimental-isel support is incomplete for this architecture at the current optimization level">,<br>
+  InGroup<ExperimentalISel>;<br>
 }<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>DiagnosticGroups.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=323485&r1=323484&r2=323485&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/DiagnosticGroups.<wbr>td?rev=323485&r1=323484&r2=<wbr>323485&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>DiagnosticGroups.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>DiagnosticGroups.td Thu Jan 25 16:27:22 2018<br>
@@ -985,3 +985,6 @@ def UnknownArgument : DiagGroup<"unknown<br>
 // A warning group for warnings about code that clang accepts when<br>
 // compiling OpenCL C/C++ but which is not compatible with the SPIR spec.<br>
 def SpirCompat : DiagGroup<"spir-compat">;<br>
+<br>
+// Warning for the experimental-isel options.<br>
+def ExperimentalISel : DiagGroup<"experimental-isel"><wbr>;<br>
<br>
Modified: cfe/trunk/include/clang/<wbr>Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=323485&r1=323484&r2=323485&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Driver/Options.td?rev=<wbr>323485&r1=323484&r2=323485&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/<wbr>Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/<wbr>Driver/Options.td Thu Jan 25 16:27:22 2018<br>
@@ -1033,6 +1033,8 @@ def finline_functions : Flag<["-"], "fin<br>
 def finline_hint_functions: Flag<["-"], "finline-hint-functions">, Group<f_clang_Group>, Flags<[CC1Option]>,<br>
   HelpText<"Inline functions which are (explicitly or implicitly) marked inline">;<br>
 def finline : Flag<["-"], "finline">, Group<clang_ignored_f_Group>;<br>
+def fexperimental_isel : Flag<["-"], "fexperimental-isel">, Group<f_clang_Group>,<br>
+  HelpText<"Enables the experimental global instruction selector">;<br>
 def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass-<wbr>manager">,<br>
   Group<f_clang_Group>, Flags<[CC1Option]>,<br>
   HelpText<"Enables an experimental new pass manager in LLVM.">;<br>
@@ -1244,6 +1246,8 @@ def fno_exceptions : Flag<["-"], "fno-ex<br>
 def fno_gnu_keywords : Flag<["-"], "fno-gnu-keywords">, Group<f_Group>, Flags<[CC1Option]>;<br>
 def fno_inline_functions : Flag<["-"], "fno-inline-functions">, Group<f_clang_Group>, Flags<[CC1Option]>;<br>
 def fno_inline : Flag<["-"], "fno-inline">, Group<f_clang_Group>, Flags<[CC1Option]>;<br>
+def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group<f_clang_Group>,<br>
+  HelpText<"Disables the experimental global instruction selector">;<br>
 def fno_experimental_new_pass_<wbr>manager : Flag<["-"], "fno-experimental-new-pass-<wbr>manager">,<br>
   Group<f_clang_Group>, Flags<[CC1Option]>,<br>
   HelpText<"Disables an experimental new pass manager in LLVM.">;<br>
<br>
Modified: cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=323485&r1=323484&r2=323485&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp?rev=<wbr>323485&r1=323484&r2=323485&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp (original)<br>
+++ cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp Thu Jan 25 16:27:22 2018<br>
@@ -4694,6 +4694,37 @@ void Clang::ConstructJob(<wbr>Compilation &C,<br>
     CmdArgs.push_back("-fwhole-<wbr>program-vtables");<br>
   }<br>
<br>
+  if (Arg *A = Args.getLastArg(options::OPT_<wbr>fexperimental_isel,<br>
+                               options::OPT_fno_experimental_<wbr>isel)) {<br>
+    CmdArgs.push_back("-mllvm");<br>
+    if (A->getOption().matches(<wbr>options::OPT_fexperimental_<wbr>isel)) {<br>
+      CmdArgs.push_back("-global-<wbr>isel=1");<br>
+<br>
+      // GISel is on by default on AArch64 -O0, so don't bother adding<br>
+      // the fallback remarks for it. Other combinations will add a warning of<br>
+      // some kind.<br>
+      bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;<br>
+      bool IsOptLevelSupported = false;<br>
+<br>
+      Arg *A = Args.getLastArg(options::OPT_<wbr>O_Group);<br>
+      if (Triple.getArch() == llvm::Triple::aarch64) {<br>
+        if (!A || A->getOption().matches(<wbr>options::OPT_O0))<br>
+          IsOptLevelSupported = true;<br>
+      }<br>
+      if (!IsArchSupported || !IsOptLevelSupported) {<br>
+        CmdArgs.push_back("-mllvm");<br>
+        CmdArgs.push_back("-global-<wbr>isel-abort=2");<br>
+<br>
+        if (!IsArchSupported)<br>
+          D.Diag(diag::warn_drv_<wbr>experimental_isel_incomplete) << Triple.getArchName();<br>
+        else<br>
+          D.Diag(diag::warn_drv_<wbr>experimental_isel_incomplete_<wbr>opt);<br>
+      }<br>
+    } else {<br>
+      CmdArgs.push_back("-global-<wbr>isel=0");<br>
+    }<br>
+  }<br>
+<br>
   // Finally add the compile command to the compilation.<br>
   if (Args.hasArg(options::OPT__<wbr>SLASH_fallback) &&<br>
       Output.getType() == types::TY_Object &&<br>
<br>
Added: cfe/trunk/test/Driver/global-<wbr>isel.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/global-isel.c?rev=323485&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Driver/<wbr>global-isel.c?rev=323485&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Driver/global-<wbr>isel.c (added)<br>
+++ cfe/trunk/test/Driver/global-<wbr>isel.c Thu Jan 25 16:27:22 2018<br>
@@ -0,0 +1,24 @@<br>
+// REQUIRES: x86-registered-target,aarch64-<wbr>registered-target<br>
+<br>
+// RUN: %clang -fexperimental-isel -S -### %s 2>&1 | FileCheck --check-prefix=ENABLED %s<br>
+// RUN: %clang -fno-experimental-isel -S -### %s 2>&1 | FileCheck --check-prefix=DISABLED %s<br>
+<br>
+// RUN: %clang -target aarch64 -fexperimental-isel -S %s -### 2>&1 | FileCheck --check-prefix=ARM64-DEFAULT %s<br>
+// RUN: %clang -target aarch64 -fexperimental-isel -S -O0 %s -### 2>&1 | FileCheck --check-prefix=ARM64-O0 %s<br>
+// RUN: %clang -target aarch64 -fexperimental-isel -S -O2 %s -### 2>&1 | FileCheck --check-prefix=ARM64-O2 %s<br>
+// RUN: %clang -target aarch64 -fexperimental-isel -Wno-experimental-isel -S -O2 %s -### 2>&1 | FileCheck --check-prefix=ARM64-O2-NOWARN %s<br>
+<br>
+// RUN: %clang -target x86_64 -fexperimental-isel -S %s -### 2>&1 | FileCheck --check-prefix=X86_64 %s<br>
+<br>
+// ENABLED: "-mllvm" "-global-isel=1"<br>
+// DISABLED: "-mllvm" "-global-isel=0"<br>
+<br>
+// ARM64-DEFAULT-NOT: warning: -fexperimental-sel<br>
+// ARM64-DEFAULT-NOT: "-global-isel-abort=2"<br>
+// ARM64-O0-NOT: warning: -fexperimental-sel<br>
+// ARM64-O2: warning: -fexperimental-isel support is incomplete for this architecture at the current optimization level<br>
+// ARM64-O2: "-mllvm" "-global-isel-abort=2"<br>
+// ARM64-O2-NOWARN-NOT: warning: -fexperimental-isel<br>
+<br>
+// X86_64: -fexperimental-isel support for the 'x86_64' architecture is incomplete<br>
+// X86_64: "-mllvm" "-global-isel-abort=2"<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>