[clang] [flang] [Flang][Driver] Enable the global-isel option (PR #177188)
Kiran Chandramohan via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 21 07:58:11 PST 2026
https://github.com/kiranchandramohan created https://github.com/llvm/llvm-project/pull/177188
None
>From d2e76051e1a157dc50d5580904db6adb07e6752a Mon Sep 17 00:00:00 2001
From: Kiran Chandramohan <kiran.chandramohan at arm.com>
Date: Wed, 21 Jan 2026 15:47:08 +0000
Subject: [PATCH] [Flang][Driver] Enable the global-isel option
---
clang/include/clang/Driver/CommonArgs.h | 4 +++
clang/include/clang/Options/Options.td | 10 +++++--
clang/lib/Driver/ToolChains/Clang.cpp | 31 +------------------
clang/lib/Driver/ToolChains/CommonArgs.cpp | 35 ++++++++++++++++++++++
clang/lib/Driver/ToolChains/Flang.cpp | 2 ++
flang/test/Driver/global-isel.f90 | 31 +++++++++++++++++++
flang/test/Driver/lto-global-isel.f90 | 8 +++++
7 files changed, 88 insertions(+), 33 deletions(-)
create mode 100644 flang/test/Driver/global-isel.f90
create mode 100644 flang/test/Driver/lto-global-isel.f90
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"
More information about the cfe-commits
mailing list