r323485 - [Driver] Add an -fexperimental-isel driver option to enable/disable GlobalISel.

Amara Emerson via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 29 13:46:48 PST 2018


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 at 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 at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180129/8a6cdbf6/attachment.html>


More information about the cfe-commits mailing list