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