yaxunl added a comment. In https://reviews.llvm.org/D34342#786941, @bader wrote:
> Added test case reproducing the issue described in the description. > Removed test cases from test/SemaOpenCL/sampler_t.cl covered by > test/CodeGenOpenCL/sampler.cl. > > While I was moving one test case from test/SemaOpenCL/sampler_t.cl, I found > another bug in CodeGen library that crashes the compilation if sampler is > initialized with non-constant expression. > > Here is a short reproducer: > > int get_sampler_initializer(void); > kernel void foo() { > const sampler_t const_smp_func_init = get_sampler_initializer(); > } > > > The problem is that clang does not discard this code as invalid, but CodeGen > library expects sampler initializer to be a constant expression: > > llvm::Value * > CodeGenModule::createOpenCLIntToSamplerConversion(const Expr *E, > CodeGenFunction &CGF) { > llvm::Constant *C = EmitConstantExpr(E, E->getType(), &CGF); // for the > reproducer expression here is CallExpr. > auto SamplerT = getOpenCLRuntime().getSamplerType(); > auto FTy = llvm::FunctionType::get(SamplerT, {C->getType()}, false); > return CGF.Builder.CreateCall(CreateRuntimeFunction(FTy, > "__translate_sampler_initializer"), > {C}); > } > > > There are two ways to handle this issue: > > 1. Implement diagnostics allowing only compile time constant initializers. > 2. Add non-constant sampler initializer support to CodeGen library. > > OpenCL specification examples give me impression that samplers declared > inside OpenCL programs must be known at compile time. On the other hand > OpenCL allows samplers passed via kernel parameters to be unknown at compile > time. > > Thoughts? The OpenCL spec v1.2 s6.9.b: The sampler type (sampler_t) can only be used as the type of a function argument or a variable declared in the program scope or the outermost scope of a kernel function. The behavior of a sampler variable declared in a non-outermost scope of a kernel function is implementation-defined. A sampler argument or variable cannot be modified. The sampler type cannot be used to declare a structure or union field, an array of samplers, a pointer to a sampler, or the return type of a function. The sampler type cannot be used with the __local and __global address space qualifiers. So a function returning sampler is invalid. However, the spec does not forbid a sampler defined in the outermost scope of a kernel function to be initialized dynamically, e.g. kernel void f(sampler_t s1, sampler_t s2, int x) { sampler_t s = x ? s1 : s2; } The question is: if we allow this, will it cause any issue? https://reviews.llvm.org/D34342 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits