forked from OSchip/llvm-project
[OpenCL] Diagnose write_only image3d when extension is disabled
Prior to OpenCL 2.0, image3d_t can only be used with the write_only access qualifier when the cl_khr_3d_image_writes extension is enabled, see e.g. OpenCL 1.1 s6.8b. Require the extension for write_only image3d_t types and guard uses of write_only image3d_t in the OpenCL header. Patch by Sven van Haastregt! Review: https://reviews.llvm.org/D28860 llvm-svn: 293050
This commit is contained in:
parent
7ecc0b7f3d
commit
d1f390ef99
|
@ -66,7 +66,7 @@ IMAGE_WRITE_TYPE(image2d_msaa, OCLImage2dMSAA, "cl_khr_gl_msaa_sharing")
|
|||
IMAGE_WRITE_TYPE(image2d_array_msaa, OCLImage2dArrayMSAA, "cl_khr_gl_msaa_sharing")
|
||||
IMAGE_WRITE_TYPE(image2d_msaa_depth, OCLImage2dMSAADepth, "cl_khr_gl_msaa_sharing")
|
||||
IMAGE_WRITE_TYPE(image2d_array_msaa_depth, OCLImage2dArrayMSAADepth, "cl_khr_gl_msaa_sharing")
|
||||
IMAGE_WRITE_TYPE(image3d, OCLImage3d, "")
|
||||
IMAGE_WRITE_TYPE(image3d, OCLImage3d, "cl_khr_3d_image_writes")
|
||||
|
||||
IMAGE_READ_WRITE_TYPE(image1d, OCLImage1d, "")
|
||||
IMAGE_READ_WRITE_TYPE(image1d_array, OCLImage1dArray, "")
|
||||
|
|
|
@ -16,6 +16,12 @@
|
|||
#endif //cl_khr_depth_images
|
||||
#endif //__OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
|
||||
#if __OPENCL_C_VERSION__ < CL_VERSION_2_0
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
#pragma OPENCL EXTENSION cl_khr_3d_image_writes : enable
|
||||
#endif //cl_khr_3d_image_writes
|
||||
#endif //__OPENCL_C_VERSION__ < CL_VERSION_2_0
|
||||
|
||||
#define __ovld __attribute__((overloadable))
|
||||
#define __conv __attribute__((convergent))
|
||||
|
||||
|
@ -15995,9 +16001,11 @@ void __ovld write_imagef(write_only image1d_array_t image_array, int2 coord, flo
|
|||
void __ovld write_imagei(write_only image1d_array_t image_array, int2 coord, int4 color);
|
||||
void __ovld write_imageui(write_only image1d_array_t image_array, int2 coord, uint4 color);
|
||||
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imagef(write_only image3d_t image, int4 coord, float4 color);
|
||||
void __ovld write_imagei(write_only image3d_t image, int4 coord, int4 color);
|
||||
void __ovld write_imageui(write_only image3d_t image, int4 coord, uint4 color);
|
||||
#endif
|
||||
|
||||
#ifdef cl_khr_depth_images
|
||||
void __ovld write_imagef(write_only image2d_depth_t image, int2 coord, float color);
|
||||
|
@ -16025,16 +16033,20 @@ void __ovld write_imageui(write_only image2d_array_t image_array, int4 coord, in
|
|||
void __ovld write_imagef(write_only image2d_depth_t image, int2 coord, int lod, float color);
|
||||
void __ovld write_imagef(write_only image2d_array_depth_t image, int4 coord, int lod, float color);
|
||||
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imagef(write_only image3d_t image, int4 coord, int lod, float4 color);
|
||||
void __ovld write_imagei(write_only image3d_t image, int4 coord, int lod, int4 color);
|
||||
void __ovld write_imageui(write_only image3d_t image, int4 coord, int lod, uint4 color);
|
||||
#endif
|
||||
#endif //cl_khr_mipmap_image
|
||||
|
||||
// Image write functions for half4 type
|
||||
#ifdef cl_khr_fp16
|
||||
void __ovld write_imageh(write_only image1d_t image, int coord, half4 color);
|
||||
void __ovld write_imageh(write_only image2d_t image, int2 coord, half4 color);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imageh(write_only image3d_t image, int4 coord, half4 color);
|
||||
#endif
|
||||
void __ovld write_imageh(write_only image1d_array_t image, int2 coord, half4 color);
|
||||
void __ovld write_imageh(write_only image2d_array_t image, int4 coord, half4 color);
|
||||
void __ovld write_imageh(write_only image1d_buffer_t image, int coord, half4 color);
|
||||
|
@ -16062,9 +16074,11 @@ void __ovld write_imagef(read_write image1d_array_t image_array, int2 coord, flo
|
|||
void __ovld write_imagei(read_write image1d_array_t image_array, int2 coord, int4 color);
|
||||
void __ovld write_imageui(read_write image1d_array_t image_array, int2 coord, uint4 color);
|
||||
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imagef(read_write image3d_t image, int4 coord, float4 color);
|
||||
void __ovld write_imagei(read_write image3d_t image, int4 coord, int4 color);
|
||||
void __ovld write_imageui(read_write image3d_t image, int4 coord, uint4 color);
|
||||
#endif
|
||||
|
||||
#ifdef cl_khr_depth_images
|
||||
void __ovld write_imagef(read_write image2d_depth_t image, int2 coord, float color);
|
||||
|
@ -16091,16 +16105,20 @@ void __ovld write_imageui(read_write image2d_array_t image_array, int4 coord, in
|
|||
void __ovld write_imagef(read_write image2d_depth_t image, int2 coord, int lod, float color);
|
||||
void __ovld write_imagef(read_write image2d_array_depth_t image, int4 coord, int lod, float color);
|
||||
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imagef(read_write image3d_t image, int4 coord, int lod, float4 color);
|
||||
void __ovld write_imagei(read_write image3d_t image, int4 coord, int lod, int4 color);
|
||||
void __ovld write_imageui(read_write image3d_t image, int4 coord, int lod, uint4 color);
|
||||
#endif
|
||||
#endif //cl_khr_mipmap_image
|
||||
|
||||
// Image write functions for half4 type
|
||||
#ifdef cl_khr_fp16
|
||||
void __ovld write_imageh(read_write image1d_t image, int coord, half4 color);
|
||||
void __ovld write_imageh(read_write image2d_t image, int2 coord, half4 color);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
void __ovld write_imageh(read_write image3d_t image, int4 coord, half4 color);
|
||||
#endif
|
||||
void __ovld write_imageh(read_write image1d_array_t image, int2 coord, half4 color);
|
||||
void __ovld write_imageh(read_write image2d_array_t image, int4 coord, half4 color);
|
||||
void __ovld write_imageh(read_write image1d_buffer_t image, int coord, half4 color);
|
||||
|
@ -16118,7 +16136,9 @@ void __ovld write_imageh(read_write image1d_buffer_t image, int coord, half4 col
|
|||
int __ovld __cnfn get_image_width(read_only image1d_t image);
|
||||
int __ovld __cnfn get_image_width(read_only image1d_buffer_t image);
|
||||
int __ovld __cnfn get_image_width(read_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_width(read_only image3d_t image);
|
||||
#endif
|
||||
int __ovld __cnfn get_image_width(read_only image1d_array_t image);
|
||||
int __ovld __cnfn get_image_width(read_only image2d_array_t image);
|
||||
#ifdef cl_khr_depth_images
|
||||
|
@ -16135,7 +16155,9 @@ int __ovld __cnfn get_image_width(read_only image2d_array_msaa_depth_t image);
|
|||
int __ovld __cnfn get_image_width(write_only image1d_t image);
|
||||
int __ovld __cnfn get_image_width(write_only image1d_buffer_t image);
|
||||
int __ovld __cnfn get_image_width(write_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_width(write_only image3d_t image);
|
||||
#endif
|
||||
int __ovld __cnfn get_image_width(write_only image1d_array_t image);
|
||||
int __ovld __cnfn get_image_width(write_only image2d_array_t image);
|
||||
#ifdef cl_khr_depth_images
|
||||
|
@ -16186,7 +16208,9 @@ int __ovld __cnfn get_image_height(read_only image2d_array_msaa_depth_t image);
|
|||
#endif //cl_khr_gl_msaa_sharing
|
||||
|
||||
int __ovld __cnfn get_image_height(write_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_height(write_only image3d_t image);
|
||||
#endif
|
||||
int __ovld __cnfn get_image_height(write_only image2d_array_t image);
|
||||
#ifdef cl_khr_depth_images
|
||||
int __ovld __cnfn get_image_height(write_only image2d_depth_t image);
|
||||
|
@ -16220,7 +16244,9 @@ int __ovld __cnfn get_image_height(read_write image2d_array_msaa_depth_t image);
|
|||
*/
|
||||
int __ovld __cnfn get_image_depth(read_only image3d_t image);
|
||||
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_depth(write_only image3d_t image);
|
||||
#endif
|
||||
|
||||
#if __OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
int __ovld __cnfn get_image_depth(read_write image3d_t image);
|
||||
|
@ -16238,7 +16264,9 @@ int __ovld get_image_num_mip_levels(read_only image3d_t image);
|
|||
|
||||
int __ovld get_image_num_mip_levels(write_only image1d_t image);
|
||||
int __ovld get_image_num_mip_levels(write_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld get_image_num_mip_levels(write_only image3d_t image);
|
||||
#endif
|
||||
|
||||
#if __OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
int __ovld get_image_num_mip_levels(read_write image1d_t image);
|
||||
|
@ -16324,7 +16352,9 @@ int __ovld __cnfn get_image_channel_data_type(read_only image2d_array_msaa_depth
|
|||
int __ovld __cnfn get_image_channel_data_type(write_only image1d_t image);
|
||||
int __ovld __cnfn get_image_channel_data_type(write_only image1d_buffer_t image);
|
||||
int __ovld __cnfn get_image_channel_data_type(write_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_channel_data_type(write_only image3d_t image);
|
||||
#endif
|
||||
int __ovld __cnfn get_image_channel_data_type(write_only image1d_array_t image);
|
||||
int __ovld __cnfn get_image_channel_data_type(write_only image2d_array_t image);
|
||||
#ifdef cl_khr_depth_images
|
||||
|
@ -16418,7 +16448,9 @@ int __ovld __cnfn get_image_channel_order(read_only image2d_array_msaa_depth_t i
|
|||
int __ovld __cnfn get_image_channel_order(write_only image1d_t image);
|
||||
int __ovld __cnfn get_image_channel_order(write_only image1d_buffer_t image);
|
||||
int __ovld __cnfn get_image_channel_order(write_only image2d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int __ovld __cnfn get_image_channel_order(write_only image3d_t image);
|
||||
#endif
|
||||
int __ovld __cnfn get_image_channel_order(write_only image1d_array_t image);
|
||||
int __ovld __cnfn get_image_channel_order(write_only image2d_array_t image);
|
||||
#ifdef cl_khr_depth_images
|
||||
|
@ -16504,7 +16536,9 @@ int2 __ovld __cnfn get_image_dim(read_write image2d_array_msaa_depth_t image);
|
|||
* component and the w component is 0.
|
||||
*/
|
||||
int4 __ovld __cnfn get_image_dim(read_only image3d_t image);
|
||||
#ifdef cl_khr_3d_image_writes
|
||||
int4 __ovld __cnfn get_image_dim(write_only image3d_t image);
|
||||
#endif
|
||||
#if __OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
int4 __ovld __cnfn get_image_dim(read_write image3d_t image);
|
||||
#endif //__OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
|
|
|
@ -1,16 +1,11 @@
|
|||
// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
|
||||
// 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
|
||||
|
||||
// CHECK: _Z16convert_char_rtec
|
||||
// CHECK-NOT: _Z3ctzc
|
||||
// CHECK20: _Z3ctzc
|
||||
// CHECK20-NOT: _Z16convert_char_rtec
|
||||
// CHECK-MOD: Reading modules
|
||||
|
||||
// Test including the default header as a module.
|
||||
// The module should be compiled only once and loaded from cache afterwards.
|
||||
// Change the directory mode to read only to make sure no new modules are created.
|
||||
// Check time report to make sure module is used.
|
||||
// Check that some builtins occur in the generated IR when called.
|
||||
|
||||
// ===
|
||||
// Clear current directory.
|
||||
|
@ -48,6 +43,12 @@
|
|||
// 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
|
||||
// RUN: chmod u+w %t
|
||||
|
||||
// Verify that called builtins occur in the generated IR.
|
||||
|
||||
// CHECK: _Z16convert_char_rtec
|
||||
// CHECK-NOT: _Z3ctzc
|
||||
// CHECK20: _Z3ctzc
|
||||
// CHECK20-NOT: _Z16convert_char_rtec
|
||||
char f(char x) {
|
||||
#if __OPENCL_C_VERSION__ != CL_VERSION_2_0
|
||||
return convert_char_rte(x);
|
||||
|
@ -59,3 +60,15 @@ char f(char x) {
|
|||
return ctz(x);
|
||||
#endif //__OPENCL_C_VERSION__
|
||||
}
|
||||
|
||||
// Verify that a builtin using a write_only image3d_t type is available
|
||||
// from OpenCL 2.0 onwards.
|
||||
|
||||
// CHECK20: _Z12write_imagef14ocl_image3d_wo
|
||||
#if __OPENCL_C_VERSION__ >= CL_VERSION_2_0
|
||||
void test_image3dwo(write_only image3d_t img) {
|
||||
write_imagef(img, (0), (0.0f));
|
||||
}
|
||||
#endif //__OPENCL_C_VERSION__
|
||||
|
||||
// CHECK-MOD: Reading modules
|
||||
|
|
|
@ -74,3 +74,7 @@ kernel void k14(read_only pipe int p) {
|
|||
myPipeWrite(p); // expected-error {{passing 'read_only pipe int' to parameter of incompatible type 'write_only pipe int'}}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if __OPENCL_C_VERSION__ < 200
|
||||
kernel void test_image3d_wo(write_only image3d_t img) {} // expected-error {{use of type '__write_only image3d_t' requires cl_khr_3d_image_writes extension to be enabled}}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue