Author: yaxunl Date: Mon May 27 04:19:07 2019 New Revision: 361757 URL: http://llvm.org/viewvc/llvm-project?rev=361757&view=rev Log: [OpenCL] Fix file-scope const sampler variable for 2.0
OpenCL spec v2.0 s6.13.14: Samplers can also be declared as global constants in the program source using the following syntax. const sampler_t <sampler name> = <value> This works fine for OpenCL 1.2 but fails for 2.0, because clang duduces address space of file-scope const sampler variable to be in global address space whereas spec v2.0 s6.9.b forbids file-scope sampler variable to be in global address space. The fix is not to deduce address space for file-scope sampler variables. Differential Revision: https://reviews.llvm.org/D62197 Modified: cfe/trunk/lib/Sema/SemaType.cpp cfe/trunk/test/CodeGenOpenCL/sampler.cl cfe/trunk/test/SemaOpenCL/sampler_t.cl Modified: cfe/trunk/lib/Sema/SemaType.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=361757&r1=361756&r2=361757&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaType.cpp (original) +++ cfe/trunk/lib/Sema/SemaType.cpp Mon May 27 04:19:07 2019 @@ -7363,7 +7363,21 @@ static void deduceOpenCLImplicitAddrSpac T->isDependentType() || // Do not deduce addr space of decltype because it will be taken from // its argument. - T->isDecltypeType()) + T->isDecltypeType() || + // OpenCL spec v2.0 s6.9.b: + // The sampler type cannot be used with the __local and __global address + // space qualifiers. + // OpenCL spec v2.0 s6.13.14: + // Samplers can also be declared as global constants in the program + // source using the following syntax. + // const sampler_t <sampler name> = <value> + // In codegen, file-scope sampler type variable has special handing and + // does not rely on address space qualifier. On the other hand, deducing + // address space of const sampler file-scope variable as global address + // space causes spurious diagnostic about __global address space + // qualifier, therefore do not deduce address space of file-scope sampler + // type variable. + (D.getContext() == DeclaratorContext::FileContext && T->isSamplerT())) return; LangAS ImpAddr = LangAS::Default; Modified: cfe/trunk/test/CodeGenOpenCL/sampler.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/sampler.cl?rev=361757&r1=361756&r2=361757&view=diff ============================================================================== --- cfe/trunk/test/CodeGenOpenCL/sampler.cl (original) +++ cfe/trunk/test/CodeGenOpenCL/sampler.cl Mon May 27 04:19:07 2019 @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -emit-llvm -triple spir-unknown-unknown -o - -O0 | FileCheck %s +// RUN: %clang_cc1 %s -cl-std=CL2.0 -emit-llvm -triple spir-unknown-unknown -o - -O0 | FileCheck %s // // This test covers 5 cases of sampler initialzation: // 1. function argument passing @@ -6,8 +7,9 @@ // 1b. argument is a function-scope variable // 1c. argument is one of caller function's parameters // 2. variable initialization -// 2a. initializing a file-scope variable +// 2a. initializing a file-scope variable with constant addr space qualifier // 2b. initializing a function-scope variable +// 2c. initializing a file-scope variable with const qualifier #define CLK_ADDRESS_CLAMP_TO_EDGE 2 #define CLK_NORMALIZED_COORDS_TRUE 1 @@ -20,6 +22,10 @@ constant sampler_t glb_smp = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; // CHECK-NOT: glb_smp +// Case 2c +const sampler_t glb_smp_const = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; +// CHECK-NOT: glb_smp_const + int get_sampler_initializer(void); void fnc4smp(sampler_t s) {} @@ -47,11 +53,16 @@ kernel void foo(sampler_t smp_par) { // CHECK: [[SAMP:%[0-9]+]] = load %opencl.sampler_t addrspace(2)*, %opencl.sampler_t addrspace(2)** [[smp_ptr]] // CHECK: call spir_func void @fnc4smp(%opencl.sampler_t addrspace(2)* [[SAMP]]) - // Case 1a + // Case 1a/2a fnc4smp(glb_smp); // CHECK: [[SAMP:%[0-9]+]] = call %opencl.sampler_t addrspace(2)* @__translate_sampler_initializer(i32 35) // CHECK: call spir_func void @fnc4smp(%opencl.sampler_t addrspace(2)* [[SAMP]]) + // Case 1a/2c + fnc4smp(glb_smp_const); + // CHECK: [[SAMP:%[0-9]+]] = call %opencl.sampler_t addrspace(2)* @__translate_sampler_initializer(i32 35) + // CHECK: call spir_func void @fnc4smp(%opencl.sampler_t addrspace(2)* [[SAMP]]) + // Case 1c fnc4smp(smp_par); // CHECK: [[SAMP:%[0-9]+]] = load %opencl.sampler_t addrspace(2)*, %opencl.sampler_t addrspace(2)** [[smp_par_ptr]] Modified: cfe/trunk/test/SemaOpenCL/sampler_t.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/sampler_t.cl?rev=361757&r1=361756&r2=361757&view=diff ============================================================================== --- cfe/trunk/test/SemaOpenCL/sampler_t.cl (original) +++ cfe/trunk/test/SemaOpenCL/sampler_t.cl Mon May 27 04:19:07 2019 @@ -1,6 +1,9 @@ // RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only // RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -DCHECK_SAMPLER_VALUE -Wspir-compat -triple amdgcn--amdhsa // RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -DCHECK_SAMPLER_VALUE -triple spir-unknown-unknown +// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only +// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only -DCHECK_SAMPLER_VALUE -Wspir-compat -triple amdgcn--amdhsa +// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only -DCHECK_SAMPLER_VALUE -triple spir-unknown-unknown #define CLK_ADDRESS_CLAMP_TO_EDGE 2 #define CLK_NORMALIZED_COORDS_TRUE 1 @@ -55,7 +58,11 @@ void kernel ker(sampler_t argsmp) { sampler_t sa[] = {argsmp, glb_smp}; // expected-error {{array of 'sampler_t' type is invalid in OpenCL}} } +#if __OPENCL_C_VERSION__ == 200 +void bad(sampler_t*); // expected-error{{pointer to type '__generic sampler_t' is invalid in OpenCL}} +#else void bad(sampler_t*); // expected-error{{pointer to type 'sampler_t' is invalid in OpenCL}} +#endif void bar() { sampler_t smp1 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits