<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Hi Tom,</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Thanks for letting me know. It has been fixed by <a href="https://github.com/llvm/llvm-project/commit/7d20f709ea6da8442a153beda7ecdda07440f046" id="LPlnk980745">
https://github.com/llvm/llvm-project/commit/7d20f709ea6da8442a153beda7ecdda07440f046</a>.</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
And sorry for disruption.</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<div style="font-family:Calibri,Arial,Helvetica,sans-serif; font-size:12pt; color:rgb(0,0,0)">
Anastasia<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Tom Stellard <tstellar@redhat.com><br>
<b>Sent:</b> 11 May 2021 06:15<br>
<b>To:</b> Anastasia Stulova <Anastasia.Stulova@arm.com>; Anastasia Stulova <llvmlistbot@llvm.org>; cfe-commits@lists.llvm.org <cfe-commits@lists.llvm.org><br>
<b>Subject:</b> Re: [clang] e994e74 - [OpenCL] Add clang extension for non-portable kernel parameters.</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">On 5/5/21 6:58 AM, Anastasia Stulova via cfe-commits wrote:<br>
> <br>
> Author: Anastasia Stulova<br>
> Date: 2021-05-05T14:58:23+01:00<br>
> New Revision: e994e74bca49831eb649e7c67955e9de7a1784b6<br>
> <br>
> URL: <a href="https://github.com/llvm/llvm-project/commit/e994e74bca49831eb649e7c67955e9de7a1784b6">
https://github.com/llvm/llvm-project/commit/e994e74bca49831eb649e7c67955e9de7a1784b6</a><br>
> DIFF: <a href="https://github.com/llvm/llvm-project/commit/e994e74bca49831eb649e7c67955e9de7a1784b6.diff">
https://github.com/llvm/llvm-project/commit/e994e74bca49831eb649e7c67955e9de7a1784b6.diff</a><br>
> <br>
> LOG: [OpenCL] Add clang extension for non-portable kernel parameters.<br>
> <br>
> Added __cl_clang_non_portable_kernel_param_types extension that<br>
> allows using non-portable types as kernel parameters. This allows<br>
> bypassing the portability guarantees from the restrictions specified<br>
> in C++ for OpenCL v1.0 s2.4.<br>
> <br>
> Currently this only disables the restrictions related to the data<br>
> layout. The programmer should ensure the compiler generates the same<br>
> layout for host and device or otherwise the argument should only be<br>
> accessed on the device side. This extension could be extended to other<br>
> case (e.g. permitting size_t) if desired in the future.<br>
> <br>
> Patch by olestrohm (Ole Strohm)!<br>
> <br>
<br>
Hi Anastasia,<br>
<br>
<br>
This change broke the clang-sphinx-docs builder:<br>
<br>
<a href="https://lab.llvm.org/buildbot/#/builders/92/builds/9110">https://lab.llvm.org/buildbot/#/builders/92/builds/9110</a><br>
<br>
-Tom<br>
<br>
> <a href="https://reviews.llvm.org/D101168">https://reviews.llvm.org/D101168</a><br>
> <br>
> Added:<br>
>      <br>
> <br>
> Modified:<br>
>      clang/docs/LanguageExtensions.rst<br>
>      clang/include/clang/Basic/OpenCLExtensions.def<br>
>      clang/lib/Basic/Targets/AMDGPU.h<br>
>      clang/lib/Basic/Targets/NVPTX.h<br>
>      clang/lib/Sema/SemaDecl.cpp<br>
>      clang/test/Misc/amdgcn.languageOptsOpenCL.cl<br>
>      clang/test/Misc/nvptx.languageOptsOpenCL.cl<br>
>      clang/test/Misc/r600.languageOptsOpenCL.cl<br>
>      clang/test/SemaOpenCLCXX/invalid-kernel.clcpp<br>
> <br>
> Removed:<br>
>      <br>
> <br>
> <br>
> ################################################################################<br>
> diff  --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst<br>
> index 5e5382879e0c8..bdb5b3adf39fb 100644<br>
> --- a/clang/docs/LanguageExtensions.rst<br>
> +++ b/clang/docs/LanguageExtensions.rst<br>
> @@ -1813,6 +1813,54 @@ supporting the variadic arguments e.g. majority of CPU targets.<br>
>     #pragma OPENCL EXTENSION __cl_clang_variadic_functions : disable<br>
>     void bar(int a, ...); // error - variadic prototype is not allowed<br>
>   <br>
> +``__cl_clang_non_portable_kernel_param_types``<br>
> +---------------------------------------------<br>
> +<br>
> +With this extension it is possible to enable the use of some restricted types<br>
> +in kernel parameters specified in `C++ for OpenCL v1.0 s2.4<br>
> +<<a href="https://www.khronos.org/opencl/assets/CXX_for_OpenCL.html#kernel_function">https://www.khronos.org/opencl/assets/CXX_for_OpenCL.html#kernel_function</a>>`_.<br>
> +The restrictions can be relaxed using regular OpenCL extension pragma mechanism<br>
> +detailed in `the OpenCL Extension Specification, section 1.2<br>
> +<<a href="https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#extensions-overview">https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_Ext.html#extensions-overview</a>>`_.<br>
> +<br>
> +This is not a conformant behavior and it can only be used when the<br>
> +kernel arguments are not accessed on the host side or the data layout/size<br>
> +between the host and device is known to be compatible.<br>
> +<br>
> +**Example of Use**:<br>
> +<br>
> +.. code-block:: c++<br>
> +<br>
> +  // Plain Old Data type.<br>
> +  struct Pod {<br>
> +    int a;<br>
> +    int b;<br>
> +  };<br>
> +<br>
> +  // Not POD type because of the constructor.<br>
> +  // Standard layout type because there is only one access control.<br>
> +  struct OnlySL {<br>
> +    int a;<br>
> +    int b;<br>
> +    NotPod() : a(0), b(0) {}<br>
> +  };<br>
> +<br>
> +  // Not standard layout type because of two<br>
> diff erent access controls.<br>
> +  struct NotSL {<br>
> +    int a;<br>
> +  private:<br>
> +    int b;<br>
> +  }<br>
> +<br>
> +  kernel void kernel_main(<br>
> +    Pod a,<br>
> +  #pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable<br>
> +    OnlySL b,<br>
> +    global NotSL *c,<br>
> +  #pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : disable<br>
> +    global OnlySL *d,<br>
> +  );<br>
> +<br>
>   Legacy 1.x atomics with generic address space<br>
>   ---------------------------------------------<br>
>   <br>
> <br>
> diff  --git a/clang/include/clang/Basic/OpenCLExtensions.def b/clang/include/clang/Basic/OpenCLExtensions.def<br>
> index 5e2977f478f3a..a0f01a2af9c37 100644<br>
> --- a/clang/include/clang/Basic/OpenCLExtensions.def<br>
> +++ b/clang/include/clang/Basic/OpenCLExtensions.def<br>
> @@ -87,6 +87,7 @@ OPENCL_EXTENSION(cl_khr_subgroups, true, 200)<br>
>   OPENCL_EXTENSION(cl_clang_storage_class_specifiers, true, 100)<br>
>   OPENCL_EXTENSION(__cl_clang_function_pointers, true, 100)<br>
>   OPENCL_EXTENSION(__cl_clang_variadic_functions, true, 100)<br>
> +OPENCL_EXTENSION(__cl_clang_non_portable_kernel_param_types, true, 100)<br>
>   <br>
>   // AMD OpenCL extensions<br>
>   OPENCL_EXTENSION(cl_amd_media_ops, true, 100)<br>
> <br>
> diff  --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h<br>
> index 8ee0ca30d305d..b2d422ce0bbe9 100644<br>
> --- a/clang/lib/Basic/Targets/AMDGPU.h<br>
> +++ b/clang/lib/Basic/Targets/AMDGPU.h<br>
> @@ -287,6 +287,7 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {<br>
>       Opts["cl_clang_storage_class_specifiers"] = true;<br>
>       Opts["__cl_clang_variadic_functions"] = true;<br>
>       Opts["__cl_clang_function_pointers"] = true;<br>
> +    Opts["__cl_clang_non_portable_kernel_param_types"] = true;<br>
>   <br>
>       bool IsAMDGCN = isAMDGCN(getTriple());<br>
>   <br>
> <br>
> diff  --git a/clang/lib/Basic/Targets/NVPTX.h b/clang/lib/Basic/Targets/NVPTX.h<br>
> index 9e80473df9e00..b7b0aae65819d 100644<br>
> --- a/clang/lib/Basic/Targets/NVPTX.h<br>
> +++ b/clang/lib/Basic/Targets/NVPTX.h<br>
> @@ -133,6 +133,7 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {<br>
>       Opts["cl_clang_storage_class_specifiers"] = true;<br>
>       Opts["__cl_clang_function_pointers"] = true;<br>
>       Opts["__cl_clang_variadic_functions"] = true;<br>
> +    Opts["__cl_clang_non_portable_kernel_param_types"] = true;<br>
>   <br>
>       Opts["cl_khr_fp64"] = true;<br>
>       Opts["cl_khr_byte_addressable_store"] = true;<br>
> <br>
> diff  --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp<br>
> index 1abb692413b9d..c1aa638369383 100644<br>
> --- a/clang/lib/Sema/SemaDecl.cpp<br>
> +++ b/clang/lib/Sema/SemaDecl.cpp<br>
> @@ -8662,6 +8662,9 @@ static bool isOpenCLSizeDependentType(ASTContext &C, QualType Ty) {<br>
>   }<br>
>   <br>
>   static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {<br>
> +  if (PT->isDependentType())<br>
> +    return InvalidKernelParam;<br>
> +<br>
>     if (PT->isPointerType() || PT->isReferenceType()) {<br>
>       QualType PointeeType = PT->getPointeeType();<br>
>       if (PointeeType.getAddressSpace() == LangAS::opencl_generic ||<br>
> @@ -8684,8 +8687,11 @@ static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {<br>
>       // Moreover the types used in parameters of the kernel functions must be:<br>
>       // Standard layout types for pointer parameters. The same applies to<br>
>       // reference if an implementation supports them in kernel parameters.<br>
> -    if (S.getLangOpts().OpenCLCPlusPlus && !PointeeType->isAtomicType() &&<br>
> -        !PointeeType->isVoidType() && !PointeeType->isStandardLayoutType())<br>
> +    if (S.getLangOpts().OpenCLCPlusPlus &&<br>
> +        !S.getOpenCLOptions().isAvailableOption(<br>
> +            "__cl_clang_non_portable_kernel_param_types", S.getLangOpts()) &&<br>
> +        !PointeeType->isAtomicType() && !PointeeType->isVoidType() &&<br>
> +        !PointeeType->isStandardLayoutType())<br>
>         return InvalidKernelParam;<br>
>   <br>
>       return PtrKernelParam;<br>
> @@ -8725,8 +8731,10 @@ static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {<br>
>     // Moreover the types used in parameters of the kernel functions must be:<br>
>     // Trivial and standard-layout types C++17 [basic.types] (plain old data<br>
>     // types) for parameters passed by value;<br>
> -  if (S.getLangOpts().OpenCLCPlusPlus && !PT->isOpenCLSpecificType() &&<br>
> -      !PT.isPODType(S.Context))<br>
> +  if (S.getLangOpts().OpenCLCPlusPlus &&<br>
> +      !S.getOpenCLOptions().isAvailableOption(<br>
> +          "__cl_clang_non_portable_kernel_param_types", S.getLangOpts()) &&<br>
> +      !PT->isOpenCLSpecificType() && !PT.isPODType(S.Context))<br>
>       return InvalidKernelParam;<br>
>   <br>
>     if (PT->isRecordType())<br>
> <br>
> diff  --git a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl<br>
> index 1dd31029d7349..7fc4e7ea005e7 100644<br>
> --- a/clang/test/Misc/amdgcn.languageOptsOpenCL.cl<br>
> +++ b/clang/test/Misc/amdgcn.languageOptsOpenCL.cl<br>
> @@ -24,6 +24,11 @@<br>
>   #endif<br>
>   #pragma OPENCL EXTENSION __cl_clang_variadic_functions : enable<br>
>   <br>
> +#ifndef __cl_clang_non_portable_kernel_param_types<br>
> +#error "Missing __cl_clang_non_portable_kernel_param_types define"<br>
> +#endif<br>
> +#pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable<br>
> +<br>
>   #ifndef cl_khr_fp16<br>
>   #error "Missing cl_khr_fp16 define"<br>
>   #endif<br>
> <br>
> diff  --git a/clang/test/Misc/nvptx.languageOptsOpenCL.cl b/clang/test/Misc/nvptx.languageOptsOpenCL.cl<br>
> index d547f4d2acfd3..6657c18f1eebe 100644<br>
> --- a/clang/test/Misc/nvptx.languageOptsOpenCL.cl<br>
> +++ b/clang/test/Misc/nvptx.languageOptsOpenCL.cl<br>
> @@ -28,6 +28,11 @@<br>
>   #endif<br>
>   #pragma OPENCL EXTENSION __cl_clang_variadic_functions : enable<br>
>   <br>
> +#ifndef __cl_clang_non_portable_kernel_param_types<br>
> +#error "Missing __cl_clang_non_portable_kernel_param_types define"<br>
> +#endif<br>
> +#pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable<br>
> +<br>
>   #ifdef cl_khr_fp16<br>
>   #error "Incorrect cl_khr_fp16 define"<br>
>   #endif<br>
> <br>
> diff  --git a/clang/test/Misc/r600.languageOptsOpenCL.cl b/clang/test/Misc/r600.languageOptsOpenCL.cl<br>
> index 2c87370f9d5fe..80c628af03608 100644<br>
> --- a/clang/test/Misc/r600.languageOptsOpenCL.cl<br>
> +++ b/clang/test/Misc/r600.languageOptsOpenCL.cl<br>
> @@ -34,6 +34,11 @@<br>
>   #endif<br>
>   #pragma OPENCL EXTENSION __cl_clang_variadic_functions : enable<br>
>   <br>
> +#ifndef __cl_clang_non_portable_kernel_param_types<br>
> +#error "Missing __cl_clang_non_portable_kernel_param_types define"<br>
> +#endif<br>
> +#pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable<br>
> +<br>
>   #ifdef cl_khr_fp16<br>
>   #error "Incorrect cl_khr_fp16 define"<br>
>   #endif<br>
> <br>
> diff  --git a/clang/test/SemaOpenCLCXX/invalid-kernel.clcpp b/clang/test/SemaOpenCLCXX/invalid-kernel.clcpp<br>
> index 977d487928b65..9bd147364483c 100644<br>
> --- a/clang/test/SemaOpenCLCXX/invalid-kernel.clcpp<br>
> +++ b/clang/test/SemaOpenCLCXX/invalid-kernel.clcpp<br>
> @@ -1,4 +1,9 @@<br>
> -// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only<br>
> +// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only -triple spir-unknown-unknown<br>
> +// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only -triple spir-unknown-unknown -DUNSAFEKERNELPARAMETER<br>
> +<br>
> +#ifdef UNSAFEKERNELPARAMETER<br>
> +#pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable<br>
> +#endif<br>
>   <br>
>   struct C {<br>
>     kernel void m(); //expected-error{{kernel functions cannot be class members}}<br>
> @@ -24,8 +29,10 @@ kernel void int_p_p(__global int *__global *in);<br>
>   kernel void int_p_r(__global int *__global &in);<br>
>   kernel void int_p_p_r(__global int *__global *__global &in);<br>
>   <br>
> -// expected-error@+1{{'__private atomic_int' (aka '__private _Atomic(int)') cannot be used as the type of a kernel parameter}}<br>
>   kernel void k_atomic_v(atomic_int in);<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +// expected-error@-2{{'__private atomic_int' (aka '__private _Atomic(int)') cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
>   kernel void k_atomic_p(__global atomic_int *in);<br>
>   kernel void k_atomic_r(__global atomic_int &in);<br>
>   <br>
> @@ -56,7 +63,10 @@ struct StandardLayout {<br>
>     StandardLayout(int a, int b) : a(a), b(b) {}<br>
>   };<br>
>   <br>
> -kernel void standard_v(StandardLayout in) {} //expected-error{{'__private StandardLayout' cannot be used as the type of a kernel parameter}}<br>
> +kernel void standard_v(StandardLayout in) {}<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +//expected-error@-2{{'__private StandardLayout' cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
>   kernel void standard_p(__global StandardLayout *in) {}<br>
>   kernel void standard_p_p(__global StandardLayout *__global *in) {}<br>
>   kernel void standard_r(__global StandardLayout &in) {}<br>
> @@ -67,7 +77,19 @@ private:<br>
>     int b;<br>
>   };<br>
>   <br>
> -kernel void trivial_v(Trivial in) {} //expected-error{{'__private Trivial' cannot be used as the type of a kernel parameter}}<br>
> -kernel void trivial_p(__global Trivial *in) {} //expected-error{{'__global Trivial *__private' cannot be used as the type of a kernel parameter}}<br>
> -kernel void trivial_p_p(__global Trivial *__global *in) {} //expected-error{{'__global Trivial *__global *__private' cannot be used as the type of a kernel parameter}}<br>
> -kernel void trivial_r(__global Trivial &in) {} //expected-error{{'__global Trivial &__private' cannot be used as the type of a kernel parameter}}<br>
> +kernel void trivial_v(Trivial in) {}<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +//expected-error@-2{{'__private Trivial' cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
> +kernel void trivial_p(__global Trivial *in) {}<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +//expected-error@-2{{'__global Trivial *__private' cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
> +kernel void trivial_p_p(__global Trivial *__global *in) {}<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +//expected-error@-2{{'__global Trivial *__global *__private' cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
> +kernel void trivial_r(__global Trivial &in) {}<br>
> +#ifndef UNSAFEKERNELPARAMETER<br>
> +//expected-error@-2{{'__global Trivial &__private' cannot be used as the type of a kernel parameter}}<br>
> +#endif<br>
> <br>
> <br>
>          <br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> cfe-commits@lists.llvm.org<br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
> <br>
<br>
</div>
</span></font></div>
</body>
</html>