llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-driver

Author: Kiran Chandramohan (kiranchandramohan)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/177188.diff


7 Files Affected:

- (modified) clang/include/clang/Driver/CommonArgs.h (+4) 
- (modified) clang/include/clang/Options/Options.td (+7-3) 
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-30) 
- (modified) clang/lib/Driver/ToolChains/CommonArgs.cpp (+35) 
- (modified) clang/lib/Driver/ToolChains/Flang.cpp (+2) 
- (added) flang/test/Driver/global-isel.f90 (+31) 
- (added) flang/test/Driver/lto-global-isel.f90 (+8) 


``````````diff
diff --git a/clang/include/clang/Driver/CommonArgs.h 
b/clang/include/clang/Driver/CommonArgs.h
index dfa0f81adc2e3..9325732f17368 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -273,6 +273,10 @@ bool shouldRecordCommandLine(const ToolChain &TC,
                              bool &FRecordCommandLine,
                              bool &GRecordCommandLine);
 
+void renderGlobalISelOptions(const Driver &D, const llvm::opt::ArgList &Args,
+                             llvm::opt::ArgStringList &CmdArgs,
+                             const llvm::Triple &Triple);
+
 void renderCommonIntegerOverflowOptions(const llvm::opt::ArgList &Args,
                                         llvm::opt::ArgStringList &CmdArgs);
 
diff --git a/clang/include/clang/Options/Options.td 
b/clang/include/clang/Options/Options.td
index 188739e72434a..e560a1b34df23 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -3043,8 +3043,10 @@ defm jmc : BoolFOption<"jmc",
           "Enable just-my-code debugging">,
   NegFlag<SetFalse>>;
 def fglobal_isel : Flag<["-"], "fglobal-isel">, Group<f_clang_Group>,
+  Visibility<[ClangOption, FlangOption]>,
   HelpText<"Enables the global instruction selector">;
 def fexperimental_isel : Flag<["-"], "fexperimental-isel">, 
Group<f_clang_Group>,
+  Visibility<[ClangOption, FlangOption]>,
   Alias<fglobal_isel>;
 def fexperimental_strict_floating_point : Flag<["-"], 
"fexperimental-strict-floating-point">,
   Group<f_clang_Group>, Visibility<[ClangOption, CC1Option]>,
@@ -3662,11 +3664,13 @@ defm digraphs : BoolFOption<"digraphs",
 def fno_eliminate_unused_debug_symbols : Flag<["-"], 
"fno-eliminate-unused-debug-symbols">, Group<f_Group>;
 def fno_inline_functions : Flag<["-"], "fno-inline-functions">, 
Group<f_clang_Group>,
   Visibility<[ClangOption, CC1Option]>;
-def fno_inline : Flag<["-"], "fno-inline">, Group<f_clang_Group>,
+def fno_inline : Flag<["-"], "fno-inline">, Group<f_Group>,
   Visibility<[ClangOption, CC1Option]>;
-def fno_global_isel : Flag<["-"], "fno-global-isel">, Group<f_clang_Group>,
+def fno_global_isel : Flag<["-"], "fno-global-isel">, Group<f_Group>,
+  Visibility<[ClangOption, FlangOption]>,
   HelpText<"Disables the global instruction selector">;
-def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, 
Group<f_clang_Group>,
+def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, 
Group<f_Group>,
+  Visibility<[ClangOption, FlangOption]>,
   Alias<fno_global_isel>;
 def fveclib : Joined<["-"], "fveclib=">, Group<f_Group>,
   Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 41ee88fd5501a..ab671d032644b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -7930,36 +7930,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction 
&JA,
     }
   }
 
-  if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
-                               options::OPT_fno_global_isel)) {
-    CmdArgs.push_back("-mllvm");
-    if (A->getOption().matches(options::OPT_fglobal_isel)) {
-      CmdArgs.push_back("-global-isel=1");
-
-      // GISel is on by default on AArch64 -O0, so don't bother adding
-      // the fallback remarks for it. Other combinations will add a warning of
-      // some kind.
-      bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
-      bool IsOptLevelSupported = false;
-
-      Arg *A = Args.getLastArg(options::OPT_O_Group);
-      if (Triple.getArch() == llvm::Triple::aarch64) {
-        if (!A || A->getOption().matches(options::OPT_O0))
-          IsOptLevelSupported = true;
-      }
-      if (!IsArchSupported || !IsOptLevelSupported) {
-        CmdArgs.push_back("-mllvm");
-        CmdArgs.push_back("-global-isel-abort=2");
-
-        if (!IsArchSupported)
-          D.Diag(diag::warn_drv_global_isel_incomplete) << 
Triple.getArchName();
-        else
-          D.Diag(diag::warn_drv_global_isel_incomplete_opt);
-      }
-    } else {
-      CmdArgs.push_back("-global-isel=0");
-    }
-  }
+  renderGlobalISelOptions(D, Args, CmdArgs, Triple);
 
   if (Arg *A = Args.getLastArg(options::OPT_fforce_enable_int128,
                                options::OPT_fno_force_enable_int128)) {
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 10a1a412eea08..6a15b68d34d0d 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3300,6 +3300,41 @@ bool tools::shouldRecordCommandLine(const ToolChain &TC,
   return FRecordCommandLine || TC.UseDwarfDebugFlags() || GRecordCommandLine;
 }
 
+void tools::renderGlobalISelOptions(const Driver &D, const ArgList &Args,
+                                    ArgStringList &CmdArgs,
+                                    const llvm::Triple &Triple) {
+  if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
+                               options::OPT_fno_global_isel)) {
+    CmdArgs.push_back("-mllvm");
+    if (A->getOption().matches(options::OPT_fglobal_isel)) {
+      CmdArgs.push_back("-global-isel=1");
+
+      // GISel is on by default on AArch64 -O0, so don't bother adding
+      // the fallback remarks for it. Other combinations will add a warning of
+      // some kind.
+      bool IsArchSupported = Triple.getArch() == llvm::Triple::aarch64;
+      bool IsOptLevelSupported = false;
+
+      Arg *A = Args.getLastArg(options::OPT_O_Group);
+      if (IsArchSupported) {
+        if (!A || A->getOption().matches(options::OPT_O0))
+          IsOptLevelSupported = true;
+      }
+      if (!IsArchSupported || !IsOptLevelSupported) {
+        CmdArgs.push_back("-mllvm");
+        CmdArgs.push_back("-global-isel-abort=2");
+
+        if (!IsArchSupported)
+          D.Diag(diag::warn_drv_global_isel_incomplete) << 
Triple.getArchName();
+        else
+          D.Diag(diag::warn_drv_global_isel_incomplete_opt);
+      }
+    } else {
+      CmdArgs.push_back("-global-isel=0");
+    }
+  }
+}
+
 void tools::renderCommonIntegerOverflowOptions(const ArgList &Args,
                                                ArgStringList &CmdArgs) {
   bool use_fwrapv = false;
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp 
b/clang/lib/Driver/ToolChains/Flang.cpp
index baf9a998a0932..3cb0f4dd6dbe4 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -1140,6 +1140,8 @@ void Flang::ConstructJob(Compilation &C, const JobAction 
&JA,
     }
   }
 
+  renderGlobalISelOptions(D, Args, CmdArgs, Triple);
+
   renderCommonIntegerOverflowOptions(Args, CmdArgs);
 
   assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
diff --git a/flang/test/Driver/global-isel.f90 
b/flang/test/Driver/global-isel.f90
new file mode 100644
index 0000000000000..db594104edccc
--- /dev/null
+++ b/flang/test/Driver/global-isel.f90
@@ -0,0 +1,31 @@
+! RUN: %flang -fglobal-isel -S -### %s 2>&1 | FileCheck --check-prefix=ENABLED 
%s
+! RUN: %flang -fno-global-isel -S -### %s 2>&1 | FileCheck 
--check-prefix=DISABLED %s
+
+! RUN: %flang -target aarch64 -fglobal-isel -S %s -### 2>&1 | FileCheck 
--check-prefix=ARM64-DEFAULT %s
+! RUN: %flang -target aarch64 -fglobal-isel -S -O0 %s -### 2>&1 | FileCheck 
--check-prefix=ARM64-O0 %s
+! RUN: %flang -target aarch64 -fglobal-isel -S -O2 %s -### 2>&1 | FileCheck 
--check-prefix=ARM64-O2 %s
+
+! RUN: %flang -target x86_64 -fglobal-isel -S %s -### 2>&1 | FileCheck 
--check-prefix=X86_64 %s
+
+! Now test the aliases.
+
+! RUN: %flang -fexperimental-isel -S -### %s 2>&1 | FileCheck 
--check-prefix=ENABLED %s
+! RUN: %flang -fno-experimental-isel -S -### %s 2>&1 | FileCheck 
--check-prefix=DISABLED %s
+
+! RUN: %flang -target aarch64 -fexperimental-isel -S %s -### 2>&1 | FileCheck 
--check-prefix=ARM64-DEFAULT %s
+! RUN: %flang -target aarch64 -fexperimental-isel -S -O0 %s -### 2>&1 | 
FileCheck --check-prefix=ARM64-O0 %s
+! RUN: %flang -target aarch64 -fexperimental-isel -S -O2 %s -### 2>&1 | 
FileCheck --check-prefix=ARM64-O2 %s
+
+! RUN: %flang -target x86_64 -fexperimental-isel -S %s -### 2>&1 | FileCheck 
--check-prefix=X86_64 %s
+
+! ENABLED: "-mllvm" "-global-isel=1"
+! DISABLED: "-mllvm" "-global-isel=0"
+
+! ARM64-DEFAULT-NOT: warning: -fglobal-isel
+! ARM64-DEFAULT-NOT: "-global-isel-abort=2"
+! ARM64-O0-NOT: warning: -fglobal-isel
+! ARM64-O2: warning: -fglobal-isel support is incomplete for this architecture 
at the current optimization level
+! ARM64-O2: "-mllvm" "-global-isel-abort=2"
+
+! X86_64: -fglobal-isel support for the 'x86_64' architecture is incomplete
+! X86_64: "-mllvm" "-global-isel-abort=2"
diff --git a/flang/test/Driver/lto-global-isel.f90 
b/flang/test/Driver/lto-global-isel.f90
new file mode 100644
index 0000000000000..c4e041c35a899
--- /dev/null
+++ b/flang/test/Driver/lto-global-isel.f90
@@ -0,0 +1,8 @@
+! -flto passes along an explicit GlobalISel flag.
+! RUN: %flang --target=aarch64-linux-gnu -### %s -flto -fglobal-isel 2> %t
+! RUN: FileCheck --check-prefix=CHECK-GISEL < %t %s
+! RUN: %flang --target=aarch64-linux-gnu -### %s -flto -fno-global-isel 2> %t
+! RUN: FileCheck --check-prefix=CHECK-DISABLE-GISEL < %t %s
+!
+! CHECK-GISEL:         "-plugin-opt=-global-isel=1"
+! CHECK-DISABLE-GISEL: "-plugin-opt=-global-isel=0"

``````````

</details>


https://github.com/llvm/llvm-project/pull/177188
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to