r273191 - [OpenCL] Include opencl-c.h by default as a clang module

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 3 15:10:04 PDT 2016


Hi,

This test (test/Headers/opencl-c-header.cl) is *extremely* slow -- it
parses the 17KLoC opencl-c.h header 40 times, and on my Debug builds it's
the slowest test by far, taking nearly 2 minutes to run *alone*. (For
reference, the *entire clang test suite* finishes in 90s on my machine with
this test removed.)

Please can you do something about this? Do we really need to parse this
header in 40 configurations here?

On Mon, Jun 20, 2016 at 12:26 PM, Yaxun Liu via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: yaxunl
> Date: Mon Jun 20 14:26:00 2016
> New Revision: 273191
>
> URL: http://llvm.org/viewvc/llvm-project?rev=273191&view=rev
> Log:
> [OpenCL] Include opencl-c.h by default as a clang module
>
> Include opencl-c.h by default as a module to utilize the automatic AST
> caching mechanism of clang modules.
>
> Add an option -finclude-default-header to enable default header for
> OpenCL, which is off by default.
>
> Differential Revision: http://reviews.llvm.org/D20444
>
> Modified:
>     cfe/trunk/include/clang/Basic/LangOptions.def
>     cfe/trunk/include/clang/Driver/CC1Options.td
>     cfe/trunk/include/clang/Frontend/CompilerInvocation.h
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>     cfe/trunk/lib/Headers/module.modulemap
>     cfe/trunk/test/Headers/opencl-c-header.cl
>
> Modified: cfe/trunk/include/clang/Basic/LangOptions.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/LangOptions.def?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/LangOptions.def (original)
> +++ cfe/trunk/include/clang/Basic/LangOptions.def Mon Jun 20 14:26:00 2016
> @@ -218,7 +218,7 @@ LANGOPT(ObjCWeak            , 1, 0, "Obj
>  LANGOPT(ObjCSubscriptingLegacyRuntime         , 1, 0, "Subscripting
> support in legacy ObjectiveC runtime")
>  LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
>  ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2,
> ASMM_Target, "OpenCL address space map mangling mode")
> -
> +LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for
> OpenCL")
>  BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing")
>  LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime")
>
>
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Driver/CC1Options.td?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Jun 20 14:26:00 2016
> @@ -612,6 +612,8 @@ def fallow_half_arguments_and_returns :
>    HelpText<"Allow function arguments and returns of type half">;
>  def fdefault_calling_conv_EQ : Joined<["-"], "fdefault-calling-conv=">,
>    HelpText<"Set default MS calling convention">;
> +def finclude_default_header : Flag<["-"], "finclude-default-header">,
> +  HelpText<"Include the default header file for OpenCL">;
>
>  // C++ TSes.
>  def fcoroutines : Flag<["-"], "fcoroutines">,
>
> Modified: cfe/trunk/include/clang/Frontend/CompilerInvocation.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/
> CompilerInvocation.h?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Frontend/CompilerInvocation.h (original)
> +++ cfe/trunk/include/clang/Frontend/CompilerInvocation.h Mon Jun 20
> 14:26:00 2016
> @@ -155,9 +155,10 @@ public:
>    /// \param Opts - The LangOptions object to set up.
>    /// \param IK - The input language.
>    /// \param T - The target triple.
> +  /// \param PPOpts - The PreprocessorOptions affected.
>    /// \param LangStd - The input language standard.
>    static void setLangDefaults(LangOptions &Opts, InputKind IK,
> -                   const llvm::Triple &T,
> +                   const llvm::Triple &T, PreprocessorOptions &PPOpts,
>                     LangStandard::Kind LangStd = LangStandard::lang_
> unspecified);
>
>    /// \brief Retrieve a module hash string that is suitable for uniquely
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> Frontend/CompilerInvocation.cpp?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Jun 20 14:26:00 2016
> @@ -1459,6 +1459,7 @@ bool isOpenCL(LangStandard::Kind LangStd
>
>  void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
>                                           const llvm::Triple &T,
> +                                         PreprocessorOptions &PPOpts,
>                                           LangStandard::Kind LangStd) {
>    // Set some properties which depend solely on the input kind; it would
> be nice
>    // to move these to the language standard, and have the driver resolve
> the
> @@ -1543,6 +1544,10 @@ void CompilerInvocation::setLangDefaults
>      Opts.DefaultFPContract = 1;
>      Opts.NativeHalfType = 1;
>      Opts.NativeHalfArgsAndReturns = 1;
> +    // Include default header file for OpenCL.
> +    if (Opts.IncludeDefaultHeader) {
> +      PPOpts.Includes.push_back("opencl-c.h");
> +    }
>    }
>
>    Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda ||
> @@ -1589,6 +1594,7 @@ static Visibility parseVisibility(Arg *a
>
>  static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
>                            const TargetOptions &TargetOpts,
> +                          PreprocessorOptions &PPOpts,
>                            DiagnosticsEngine &Diags) {
>    // FIXME: Cleanup per-file based stuff.
>    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
> @@ -1660,8 +1666,10 @@ static void ParseLangArgs(LangOptions &O
>        LangStd = OpenCLLangStd;
>    }
>
> +  Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
> +
>    llvm::Triple T(TargetOpts.Triple);
> -  CompilerInvocation::setLangDefaults(Opts, IK, T, LangStd);
> +  CompilerInvocation::setLangDefaults(Opts, IK, T, PPOpts, LangStd);
>
>    // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension
>    // keywords. This behavior is provided by GCC's poorly named '-fasm'
> flag,
> @@ -2331,7 +2339,8 @@ bool CompilerInvocation::CreateFromArgs(
>                          Diags, LangOpts.Sanitize);
>    } else {
>      // Other LangOpts are only initialzed when the input is not AST or
> LLVM IR.
> -    ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(), Diags);
> +    ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(),
> +      Res.getPreprocessorOpts(), Diags);
>      if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
>        LangOpts.ObjCExceptions = 1;
>    }
>
> Modified: cfe/trunk/lib/Headers/module.modulemap
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/
> module.modulemap?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Headers/module.modulemap (original)
> +++ cfe/trunk/lib/Headers/module.modulemap Mon Jun 20 14:26:00 2016
> @@ -157,3 +157,8 @@ module _Builtin_intrinsics [system] [ext
>  module _Builtin_stddef_max_align_t [system] [extern_c] {
>    header "__stddef_max_align_t.h"
>  }
> +
> +module opencl_c {
> +  requires opencl
> +  header "opencl-c.h"
> +}
>
> Modified: cfe/trunk/test/Headers/opencl-c-header.cl
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> Headers/opencl-c-header.cl?rev=273191&r1=273190&r2=273191&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/Headers/opencl-c-header.cl (original)
> +++ cfe/trunk/test/Headers/opencl-c-header.cl Mon Jun 20 14:26:00 2016
> @@ -1,33 +1,90 @@
>  // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple spir64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple ppc64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple powerpc-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple nvptx-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>  // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
>  // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1|
> FileCheck %s
>  // RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.2|
> FileCheck %s
> -// RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck %s
> +// RUN: %clang_cc1 -triple nvptx64-unknown-unknown -internal-isystem
> ../../lib/Headers -include opencl-c.h -fblocks -emit-llvm -o - %s
> -cl-std=CL2.0| FileCheck --check-prefix=CHECK20 %s
>
> +// RUN: %clang_cc1 -finclude-default-header -emit-llvm -o - %s |
> FileCheck %s
>  // CHECK: _Z16convert_char_rtec
> +// CHECK-NOT: _Z3ctzc
> +// CHECK20: _Z3ctzc
> +// CHECK20-NOT: _Z16convert_char_rtec
> +// CHECK-MOD: Reading modules
> +
> +// Test including the default header as a module.
> +// The module should be compiled only once and loaded from cache
> afterwards.
> +// Change the directory mode to read only to make sure no new modules are
> created.
> +// Check time report to make sure module is used.
> +
> +// ===
> +// Clear current directory.
> +// RUN: rm -rf %t
> +// RUN: mkdir -p %t
> +
> +// ===
> +// Compile for OpenCL 1.0 for the first time. A module should be
> generated.
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 |
> FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
> +// RUN: chmod u-w %t/opencl_c.pcm
> +
> +// ===
> +// Compile for OpenCL 1.0 for the second time. The module should not be
> re-created.
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 |
> FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
> +// RUN: chmod u+w %t/opencl_c.pcm
> +// RUN: mv %t/opencl_c.pcm %t/1_0.pcm
> +
> +// ===
> +// Compile for OpenCL 2.0 for the first time. The module should change.
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 |
> FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +// RUN: not diff %t/1_0.pcm %t/opencl_c.pcm
> +// RUN: chmod u-w %t/opencl_c.pcm
> +
> +// ===
> +// Compile for OpenCL 2.0 for the second time. The module should not
> change.
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 |
> FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +
> +// Check cached module works for different OpenCL versions.
> +// RUN: rm -rf %t
> +// RUN: mkdir -p %t
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK --check-prefix=CHECK-MOD %s
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +// RUN: chmod u-w %t/*
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK --check-prefix=CHECK-MOD %s
> +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o -
> -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0
> -finclude-default-header -fmodules -fimplicit-module-maps
> -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck
> --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
> +// RUN: chmod u+w %t/*
> +
>  char f(char x) {
> +#if __OPENCL_C_VERSION__ != CL_VERSION_2_0
>    return convert_char_rte(x);
> +#ifdef NO_HEADER
> +  //expected-warning at -2{{implicit declaration of function
> 'convert_char_rte' is invalid in C99}}
> +#endif //NO_HEADER
> +
> +#else //__OPENCL_C_VERSION__
> +  return ctz(x);
> +#endif //__OPENCL_C_VERSION__
>  }
>
>
> _______________________________________________
> 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/20161103/e0c977a4/attachment-0001.html>


More information about the cfe-commits mailing list