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
