Hi Hans, 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.
Cheers, Amara On 25 January 2018 at 16:27, Amara Emerson via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: aemerson > Date: Thu Jan 25 16:27:22 2018 > New Revision: 323485 > > URL: http://llvm.org/viewvc/llvm-project?rev=323485&view=rev > Log: > [Driver] Add an -fexperimental-isel driver option to enable/disable > GlobalISel. > > Differential Revision: https://reviews.llvm.org/D42276 > > Added: > cfe/trunk/test/Driver/global-isel.c > Modified: > cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > cfe/trunk/include/clang/Basic/DiagnosticGroups.td > cfe/trunk/include/clang/Driver/Options.td > cfe/trunk/lib/Driver/ToolChains/Clang.cpp > > Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/ > DiagnosticDriverKinds.td?rev=323485&r1=323484&r2=323485&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Thu Jan 25 > 16:27:22 2018 > @@ -361,4 +361,12 @@ def warn_drv_fine_grained_bitfield_acces > def note_drv_verify_prefix_spelling : Note< > "-verify prefixes must start with a letter and contain only > alphanumeric" > " characters, hyphens, and underscores">; > + > +def warn_drv_experimental_isel_incomplete : Warning< > + "-fexperimental-isel support for the '%0' architecture is incomplete">, > + InGroup<ExperimentalISel>; > + > +def warn_drv_experimental_isel_incomplete_opt : Warning< > + "-fexperimental-isel support is incomplete for this architecture at the > current optimization level">, > + InGroup<ExperimentalISel>; > } > > Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Basic/DiagnosticGroups.td?rev=323485&r1=323484&r2=323485&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Thu Jan 25 16:27:22 > 2018 > @@ -985,3 +985,6 @@ def UnknownArgument : DiagGroup<"unknown > // A warning group for warnings about code that clang accepts when > // compiling OpenCL C/C++ but which is not compatible with the SPIR spec. > def SpirCompat : DiagGroup<"spir-compat">; > + > +// Warning for the experimental-isel options. > +def ExperimentalISel : DiagGroup<"experimental-isel">; > > Modified: cfe/trunk/include/clang/Driver/Options.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Driver/Options.td?rev=323485&r1=323484&r2=323485&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Driver/Options.td (original) > +++ cfe/trunk/include/clang/Driver/Options.td Thu Jan 25 16:27:22 2018 > @@ -1033,6 +1033,8 @@ def finline_functions : Flag<["-"], "fin > def finline_hint_functions: Flag<["-"], "finline-hint-functions">, > Group<f_clang_Group>, Flags<[CC1Option]>, > HelpText<"Inline functions which are (explicitly or implicitly) marked > inline">; > def finline : Flag<["-"], "finline">, Group<clang_ignored_f_Group>; > +def fexperimental_isel : Flag<["-"], "fexperimental-isel">, > Group<f_clang_Group>, > + HelpText<"Enables the experimental global instruction selector">; > def fexperimental_new_pass_manager : Flag<["-"], "fexperimental-new-pass- > manager">, > Group<f_clang_Group>, Flags<[CC1Option]>, > HelpText<"Enables an experimental new pass manager in LLVM.">; > @@ -1244,6 +1246,8 @@ def fno_exceptions : Flag<["-"], "fno-ex > def fno_gnu_keywords : Flag<["-"], "fno-gnu-keywords">, Group<f_Group>, > Flags<[CC1Option]>; > def fno_inline_functions : Flag<["-"], "fno-inline-functions">, > Group<f_clang_Group>, Flags<[CC1Option]>; > def fno_inline : Flag<["-"], "fno-inline">, Group<f_clang_Group>, > Flags<[CC1Option]>; > +def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, > Group<f_clang_Group>, > + HelpText<"Disables the experimental global instruction selector">; > def fno_experimental_new_pass_manager : Flag<["-"], > "fno-experimental-new-pass-manager">, > Group<f_clang_Group>, Flags<[CC1Option]>, > HelpText<"Disables an experimental new pass manager in LLVM.">; > > Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ > ToolChains/Clang.cpp?rev=323485&r1=323484&r2=323485&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Thu Jan 25 16:27:22 2018 > @@ -4694,6 +4694,37 @@ void Clang::ConstructJob(Compilation &C, > CmdArgs.push_back("-fwhole-program-vtables"); > } > > + if (Arg *A = Args.getLastArg(options::OPT_fexperimental_isel, > + options::OPT_fno_experimental_isel)) { > + CmdArgs.push_back("-mllvm"); > + if (A->getOption().matches(options::OPT_fexperimental_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_experimental_isel_incomplete) << > Triple.getArchName(); > + else > + D.Diag(diag::warn_drv_experimental_isel_incomplete_opt); > + } > + } else { > + CmdArgs.push_back("-global-isel=0"); > + } > + } > + > // Finally add the compile command to the compilation. > if (Args.hasArg(options::OPT__SLASH_fallback) && > Output.getType() == types::TY_Object && > > Added: cfe/trunk/test/Driver/global-isel.c > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/ > global-isel.c?rev=323485&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Driver/global-isel.c (added) > +++ cfe/trunk/test/Driver/global-isel.c Thu Jan 25 16:27:22 2018 > @@ -0,0 +1,24 @@ > +// REQUIRES: x86-registered-target,aarch64-registered-target > + > +// RUN: %clang -fexperimental-isel -S -### %s 2>&1 | FileCheck > --check-prefix=ENABLED %s > +// RUN: %clang -fno-experimental-isel -S -### %s 2>&1 | FileCheck > --check-prefix=DISABLED %s > + > +// RUN: %clang -target aarch64 -fexperimental-isel -S %s -### 2>&1 | > FileCheck --check-prefix=ARM64-DEFAULT %s > +// RUN: %clang -target aarch64 -fexperimental-isel -S -O0 %s -### 2>&1 | > FileCheck --check-prefix=ARM64-O0 %s > +// RUN: %clang -target aarch64 -fexperimental-isel -S -O2 %s -### 2>&1 | > FileCheck --check-prefix=ARM64-O2 %s > +// RUN: %clang -target aarch64 -fexperimental-isel -Wno-experimental-isel > -S -O2 %s -### 2>&1 | FileCheck --check-prefix=ARM64-O2-NOWARN %s > + > +// RUN: %clang -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: -fexperimental-sel > +// ARM64-DEFAULT-NOT: "-global-isel-abort=2" > +// ARM64-O0-NOT: warning: -fexperimental-sel > +// ARM64-O2: warning: -fexperimental-isel support is incomplete for this > architecture at the current optimization level > +// ARM64-O2: "-mllvm" "-global-isel-abort=2" > +// ARM64-O2-NOWARN-NOT: warning: -fexperimental-isel > + > +// X86_64: -fexperimental-isel support for the 'x86_64' architecture is > incomplete > +// X86_64: "-mllvm" "-global-isel-abort=2" > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits