forked from OSchip/llvm-project
[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 llvm-svn: 361757
This commit is contained in:
parent
c675215f67
commit
a53d48b7f4
|
@ -7363,7 +7363,21 @@ static void deduceOpenCLImplicitAddrSpace(TypeProcessingState &State,
|
|||
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;
|
||||
|
|
|
@ -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]]
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue