[OpenCL] Add missing OpenCL 3.0 features to OpenCLExtensions.def; revert header-only macros (#168016)

Adds the remaining optional feature macros from the OpenCL C 3.0 spec
(section 6.2.1 table). Targets can now enable these via
OpenCLFeaturesMap returned by getSupportedOpenCLOpts().

Revert a84599f177 (header‑only feature macros).
Header‑only macros are difficult to disable on SPIR-V targets,
and the prior undef approach (a60b8f4681) does not scale.
After this PR, they can be disabled via `-cl-ext=-<feature>`.

https://github.com/KhronosGroup/OpenCL-Docs/issues/1328 also notes that
unconditional definition of the header‑only macros in opencl-c-base.h
should be removed.
This commit is contained in:
Wenju He
2025-11-21 09:17:43 +08:00
committed by GitHub
parent 8439aebd3d
commit 423bdb2bf2
8 changed files with 371 additions and 156 deletions

View File

@@ -217,9 +217,9 @@ This section explains how to extend clang with the new functionality.
**Parsing functionality**
If an extension modifies the standard parsing it needs to be added to
the clang frontend source code. This also means that the associated macro
indicating the presence of the extension should be added to clang.
If a new extension is added it needs to be added to the clang frontend source
code. This also means that the associated macro indicating the presence of the
extension should be added to clang.
The default flow for adding a new extension into the frontend is to
modify `OpenCLExtensions.def
@@ -242,7 +242,7 @@ with :option:`-cl-ext` command-line flags.
**Library functionality**
If an extension adds functionality that does not modify standard language
parsing it should not require modifying anything other than header files and
parsing it may not require modifying anything other than header files and
``OpenCLBuiltins.td`` detailed in :ref:`OpenCL builtins <opencl_builtins>`.
Most commonly such extensions add functionality via libraries (by adding
non-native types or functions) parsed regularly. Similar to other languages this
@@ -250,13 +250,7 @@ is the most common way to add new functionality.
Clang has standard headers where new types and functions are being added,
for more details refer to
:ref:`the section on the OpenCL Header <opencl_header>`. The macros indicating
the presence of such extensions can be added in the standard header files
conditioned on target specific predefined macros or/and language version
predefined macros (see `feature/extension preprocessor macros defined in
opencl-c-base.h
<https://github.com/llvm/llvm-project/blob/main/clang/lib/Headers/opencl-c-base.h>`__).
:ref:`the section on the OpenCL Header <opencl_header>`.
**Pragmas**
Some extensions alter standard parsing dynamically via pragmas.

View File

@@ -236,6 +236,11 @@ C23 Feature Support
Non-comprehensive list of changes in this release
-------------------------------------------------
- Removed OpenCL header-only feature macros (previously unconditionally enabled
on SPIR-V and only selectively disabled via ``-D__undef_<feature>``). All
OpenCL extensions and features are now centralized in OpenCLExtensions.def,
allowing consistent control via ``getSupportedOpenCLOpts`` and ``-cl-ext``.
- Added ``__builtin_elementwise_ldexp``.
- Added ``__builtin_elementwise_fshl`` and ``__builtin_elementwise_fshr``.

View File

@@ -78,10 +78,55 @@ OPENCL_EXTENSION(cl_khr_depth_images, true, 120)
OPENCL_EXTENSION(cl_khr_gl_msaa_sharing,true, 120)
// OpenCL 2.0.
OPENCL_EXTENSION(cl_ext_float_atomics, false, 200)
OPENCL_EXTENSION(cl_khr_extended_bit_ops, false, 200)
OPENCL_EXTENSION(cl_khr_integer_dot_product, false, 200)
OPENCL_EXTENSION(cl_khr_kernel_clock, false, 200)
OPENCL_EXTENSION(cl_khr_mipmap_image, true, 200)
OPENCL_EXTENSION(cl_khr_mipmap_image_writes, true, 200)
OPENCL_EXTENSION(cl_khr_srgb_image_writes, true, 200)
OPENCL_EXTENSION(cl_khr_subgroup_ballot, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_clustered_reduce, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_extended_types, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_non_uniform_arithmetic, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_non_uniform_vote, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_rotate, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_shuffle_relative, false, 200)
OPENCL_EXTENSION(cl_khr_subgroup_shuffle, false, 200)
OPENCL_EXTENSION(cl_khr_subgroups, true, 200)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_acq_rel, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_seq_cst, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_scope_all_devices, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_scope_device, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_device_enqueue, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_load_store, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_global_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_load_store, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp16_local_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_global_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_global_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_local_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp32_local_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_global_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_global_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_local_atomic_add, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_fp64_local_atomic_min_max, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_image_raw10_raw12, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_image_unorm_int_2_101010, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_ext_image_unsigned_10x6_12x4_14x2, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_generic_address_space, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_images, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_integer_dot_product_input_4x8bit, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_integer_dot_product_input_4x8bit_packed, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_kernel_clock_scope_device, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_kernel_clock_scope_sub_group, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_kernel_clock_scope_work_group, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_pipes, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_program_scope_global_variables, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_read_write_images, false, 200, OCL_C_20)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_work_group_collective_functions, false, 200, OCL_C_20)
// Clang Extensions.
OPENCL_EXTENSION(cl_clang_storage_class_specifiers, true, 100)
@@ -100,17 +145,9 @@ OPENCL_EXTENSION(cl_intel_subgroups_short, true, 120)
OPENCL_EXTENSION(cl_intel_device_side_avc_motion_estimation, true, 120)
// OpenCL C 3.0 features (6.2.1. Features)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_pipes, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_generic_address_space, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_acq_rel, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_atomic_order_seq_cst, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_subgroups, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_3d_image_writes, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_device_enqueue, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_read_write_images, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_program_scope_global_variables, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_fp64, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_images, false, 300, OCL_C_30)
OPENCL_OPTIONALCOREFEATURE(__opencl_c_subgroups, false, 300, OCL_C_30)
#undef OPENCL_OPTIONALCOREFEATURE
#undef OPENCL_COREFEATURE

View File

@@ -320,6 +320,8 @@ public:
Opts["__opencl_c_3d_image_writes"] = true;
Opts["cl_khr_3d_image_writes"] = true;
Opts["__opencl_c_program_scope_global_variables"] = true;
Opts["__opencl_c_atomic_order_seq_cst"] = true;
Opts["__opencl_c_atomic_scope_all_devices"] = true;
if (GPUKind >= llvm::AMDGPU::GK_GFX700) {
Opts["__opencl_c_generic_address_space"] = true;

View File

@@ -9,105 +9,6 @@
#ifndef _OPENCL_BASE_H_
#define _OPENCL_BASE_H_
// Define extension macros
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
// For SPIR and SPIR-V all extensions are supported.
#if defined(__SPIR__) || defined(__SPIRV__)
#define cl_khr_subgroup_extended_types 1
#define cl_khr_subgroup_non_uniform_vote 1
#define cl_khr_subgroup_ballot 1
#define cl_khr_subgroup_non_uniform_arithmetic 1
#define cl_khr_subgroup_shuffle 1
#define cl_khr_subgroup_shuffle_relative 1
#define cl_khr_subgroup_clustered_reduce 1
#define cl_khr_subgroup_rotate 1
#define cl_khr_extended_bit_ops 1
#define cl_khr_integer_dot_product 1
#define __opencl_c_integer_dot_product_input_4x8bit 1
#define __opencl_c_integer_dot_product_input_4x8bit_packed 1
#define cl_ext_float_atomics 1
#ifdef cl_khr_fp16
#define __opencl_c_ext_fp16_global_atomic_load_store 1
#define __opencl_c_ext_fp16_local_atomic_load_store 1
#define __opencl_c_ext_fp16_global_atomic_add 1
#define __opencl_c_ext_fp16_local_atomic_add 1
#define __opencl_c_ext_fp16_global_atomic_min_max 1
#define __opencl_c_ext_fp16_local_atomic_min_max 1
#endif
#ifdef cl_khr_fp64
#define __opencl_c_ext_fp64_global_atomic_add 1
#define __opencl_c_ext_fp64_local_atomic_add 1
#define __opencl_c_ext_fp64_global_atomic_min_max 1
#define __opencl_c_ext_fp64_local_atomic_min_max 1
#endif
#define __opencl_c_ext_fp32_global_atomic_add 1
#define __opencl_c_ext_fp32_local_atomic_add 1
#define __opencl_c_ext_fp32_global_atomic_min_max 1
#define __opencl_c_ext_fp32_local_atomic_min_max 1
#define __opencl_c_ext_image_raw10_raw12 1
#define __opencl_c_ext_image_unorm_int_2_101010 1
#define __opencl_c_ext_image_unsigned_10x6_12x4_14x2 1
#define cl_khr_kernel_clock 1
#define __opencl_c_kernel_clock_scope_device 1
#define __opencl_c_kernel_clock_scope_work_group 1
#define __opencl_c_kernel_clock_scope_sub_group 1
#endif // defined(__SPIR__) || defined(__SPIRV__)
#endif // (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
// Define feature macros for OpenCL C 2.0
#if (__OPENCL_CPP_VERSION__ == 100 || __OPENCL_C_VERSION__ == 200)
#define __opencl_c_pipes 1
#define __opencl_c_generic_address_space 1
#define __opencl_c_work_group_collective_functions 1
#define __opencl_c_atomic_order_acq_rel 1
#define __opencl_c_atomic_order_seq_cst 1
#define __opencl_c_atomic_scope_device 1
#define __opencl_c_atomic_scope_all_devices 1
#define __opencl_c_device_enqueue 1
#define __opencl_c_read_write_images 1
#define __opencl_c_program_scope_global_variables 1
#define __opencl_c_images 1
#endif
// Define header-only feature macros for OpenCL C 3.0.
#if (__OPENCL_CPP_VERSION__ == 202100 || __OPENCL_C_VERSION__ == 300)
// For the SPIR and SPIR-V target all features are supported.
#if defined(__SPIR__) || defined(__SPIRV__)
#define __opencl_c_work_group_collective_functions 1
#define __opencl_c_atomic_order_seq_cst 1
#define __opencl_c_atomic_scope_device 1
#define __opencl_c_atomic_scope_all_devices 1
#define __opencl_c_read_write_images 1
#endif // defined(__SPIR__)
#endif // (__OPENCL_CPP_VERSION__ == 202100 || __OPENCL_C_VERSION__ == 300)
// Undefine any feature macros that have been explicitly disabled using
// an __undef_<feature> macro.
#ifdef __undef___opencl_c_work_group_collective_functions
#undef __opencl_c_work_group_collective_functions
#endif
#ifdef __undef___opencl_c_atomic_order_seq_cst
#undef __opencl_c_atomic_order_seq_cst
#endif
#ifdef __undef___opencl_c_atomic_scope_device
#undef __opencl_c_atomic_scope_device
#endif
#ifdef __undef___opencl_c_atomic_scope_all_devices
#undef __opencl_c_atomic_scope_all_devices
#endif
#ifdef __undef___opencl_c_read_write_images
#undef __opencl_c_read_write_images
#endif
#ifdef __undef___opencl_c_integer_dot_product_input_4x8bit
#undef __opencl_c_integer_dot_product_input_4x8bit
#endif
#ifdef __undef___opencl_c_integer_dot_product_input_4x8bit_packed
#undef __opencl_c_integer_dot_product_input_4x8bit_packed
#endif
#if !defined(__opencl_c_generic_address_space)
// Internal feature macro to provide named (global, local, private) address
// space overloads for builtin functions that take a pointer argument.

View File

@@ -33,7 +33,7 @@
// ===
// Compile for OpenCL 2.0 for the first time. The module should change.
// RUN: %clang_cc1 -triple spir-unknown-unknown -O0 -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
// RUN: not diff %t/1_0.pcm %t/opencl_c.pcm
// RUN: not diff %t/1_0.pcm %t/opencl_c.pcm > /dev/null
// RUN: chmod u-w %t/opencl_c.pcm
// ===
@@ -44,10 +44,10 @@
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: %clang_cc1 -triple spir64-unknown-unknown -emit-llvm -o - -cl-std=CL1.2 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
// RUN: %clang_cc1 -triple amdgcn--amdhsa -O0 -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: %clang_cc1 -triple amdgcn--amdhsa -target-cpu gfx700 -O0 -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
// RUN: %clang_cc1 -triple spir64-unknown-unknown -emit-llvm -o - -cl-std=CL1.2 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
// RUN: %clang_cc1 -triple amdgcn--amdhsa -O0 -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: %clang_cc1 -triple amdgcn--amdhsa -target-cpu gfx700 -O0 -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.

View File

@@ -165,6 +165,150 @@
#endif
#pragma OPENCL EXTENSION cl_khr_subgroups : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_ext_float_atomics
#error "Missing cl_ext_float_atomics define"
#endif
#else
#ifdef cl_ext_float_atomics
#error "Incorrect cl_ext_float_atomics define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_ext_float_atomics' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_ext_float_atomics : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_extended_bit_ops
#error "Missing cl_khr_extended_bit_ops define"
#endif
#else
#ifdef cl_khr_extended_bit_ops
#error "Incorrect cl_khr_extended_bit_ops define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_extended_bit_ops' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_extended_bit_ops : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_integer_dot_product
#error "Missing cl_khr_integer_dot_product define"
#endif
#else
#ifdef cl_khr_integer_dot_product
#error "Incorrect cl_khr_integer_dot_product define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_integer_dot_product' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_integer_dot_product : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_kernel_clock
#error "Missing cl_khr_kernel_clock define"
#endif
#else
#ifdef cl_khr_kernel_clock
#error "Incorrect cl_khr_kernel_clock define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_kernel_clock' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_kernel_clock : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_ballot
#error "Missing cl_khr_subgroup_ballot define"
#endif
#else
#ifdef cl_khr_subgroup_ballot
#error "Incorrect cl_khr_subgroup_ballot define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_ballot' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_ballot : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_clustered_reduce
#error "Missing cl_khr_subgroup_clustered_reduce define"
#endif
#else
#ifdef cl_khr_subgroup_clustered_reduce
#error "Incorrect cl_khr_subgroup_clustered_reduce define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_clustered_reduce' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_clustered_reduce : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_extended_types
#error "Missing cl_khr_subgroup_extended_types define"
#endif
#else
#ifdef cl_khr_subgroup_extended_types
#error "Incorrect cl_khr_subgroup_extended_types define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_extended_types' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_extended_types : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_non_uniform_arithmetic
#error "Missing cl_khr_subgroup_non_uniform_arithmetic define"
#endif
#else
#ifdef cl_khr_subgroup_non_uniform_arithmetic
#error "Incorrect cl_khr_subgroup_non_uniform_arithmetic define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_non_uniform_arithmetic' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_non_uniform_arithmetic : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_non_uniform_vote
#error "Missing cl_khr_subgroup_non_uniform_vote define"
#endif
#else
#ifdef cl_khr_subgroup_non_uniform_vote
#error "Incorrect cl_khr_subgroup_non_uniform_vote define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_non_uniform_vote' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_non_uniform_vote : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_rotate
#error "Missing cl_khr_subgroup_rotate define"
#endif
#else
#ifdef cl_khr_subgroup_rotate
#error "Incorrect cl_khr_subgroup_rotate define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_rotate' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_rotate : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_shuffle_relative
#error "Missing cl_khr_subgroup_shuffle_relative define"
#endif
#else
#ifdef cl_khr_subgroup_shuffle_relative
#error "Incorrect cl_khr_subgroup_shuffle_relative define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_shuffle_relative' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_shuffle_relative : enable
#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 200)
#ifndef cl_khr_subgroup_shuffle
#error "Missing cl_khr_subgroup_shuffle define"
#endif
#else
#ifdef cl_khr_subgroup_shuffle
#error "Incorrect cl_khr_subgroup_shuffle define"
#endif
#endif
// expected-warning@+1{{OpenCL extension 'cl_khr_subgroup_shuffle' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION cl_khr_subgroup_shuffle : enable
#ifndef cl_amd_media_ops
#error "Missing cl_amd_media_ops define"
#endif
@@ -224,14 +368,62 @@
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_order_acq_rel' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_order_seq_cst : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_order_seq_cst' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_scope_all_devices : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_scope_all_devices' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_scope_device : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_scope_device' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_device_enqueue : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_device_enqueue' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_load_store : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_load_store' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_load_store : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_load_store' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_global_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_global_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_local_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_local_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_global_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_global_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_local_atomic_add : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_local_atomic_min_max : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_raw10_raw12 : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_raw10_raw12' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_unorm_int_2_101010 : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_unorm_int_2_101010' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_unsigned_10x6_12x4_14x2 : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_unsigned_10x6_12x4_14x2' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_fp64 : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_fp64' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_generic_address_space : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_generic_address_space' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_images : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_images' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_integer_dot_product_input_4x8bit : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_integer_dot_product_input_4x8bit' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_integer_dot_product_input_4x8bit_packed : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_integer_dot_product_input_4x8bit_packed' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_device : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_device' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_sub_group : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_sub_group' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_work_group : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_work_group' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_pipes : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_pipes' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_program_scope_global_variables : disable
@@ -240,6 +432,8 @@
//expected-warning@-1{{OpenCL extension '__opencl_c_read_write_images' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_subgroups : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_subgroups' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_work_group_collective_functions : disable
//expected-warning@-1{{OpenCL extension '__opencl_c_work_group_collective_functions' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_int64 : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_int64' unknown or does not require pragma - ignoring}}
@@ -249,14 +443,62 @@
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_order_acq_rel' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_order_seq_cst : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_order_seq_cst' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_scope_all_devices : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_scope_all_devices' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_atomic_scope_device : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_atomic_scope_device' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_device_enqueue : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_device_enqueue' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_load_store : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_load_store' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_global_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_load_store : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_load_store' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp16_local_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp16_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_global_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_global_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_local_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp32_local_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp32_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_global_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_global_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_global_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_global_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_local_atomic_add : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_local_atomic_add' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_fp64_local_atomic_min_max : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_fp64_local_atomic_min_max' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_raw10_raw12 : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_raw10_raw12' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_unorm_int_2_101010 : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_unorm_int_2_101010' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_ext_image_unsigned_10x6_12x4_14x2 : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_ext_image_unsigned_10x6_12x4_14x2' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_fp64 : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_fp64' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_generic_address_space : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_generic_address_space' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_images : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_images' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_integer_dot_product_input_4x8bit : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_integer_dot_product_input_4x8bit' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_integer_dot_product_input_4x8bit_packed : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_integer_dot_product_input_4x8bit_packed' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_device : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_device' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_sub_group : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_sub_group' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_kernel_clock_scope_work_group : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_kernel_clock_scope_work_group' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_pipes : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_pipes' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_program_scope_global_variables : enable
@@ -265,3 +507,5 @@
//expected-warning@-1{{OpenCL extension '__opencl_c_read_write_images' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_subgroups : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_subgroups' unknown or does not require pragma - ignoring}}
#pragma OPENCL EXTENSION __opencl_c_work_group_collective_functions : enable
//expected-warning@-1{{OpenCL extension '__opencl_c_work_group_collective_functions' unknown or does not require pragma - ignoring}}

View File

@@ -15,31 +15,29 @@
// RUN: %clang_cc1 -triple r600-unknown-unknown %s -E -dM -o - -x cl -cl-std=clc++2021 -cl-ext=+all \
// RUN: | FileCheck -match-full-lines %s --check-prefix=FEATURES
// For OpenCL C 2.0 feature macros are defined only in header, so test that earlier OpenCL
// versions don't define feature macros accidentally and CL2.0 don't define them without header
// For OpenCL C 2.0 feature macros, test that CL2.0 define them but earlier OpenCL
// versions don't define feature macros accidentally.
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL1.1 \
// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL1.2 \
// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL2.0 \
// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES
// RUN: | FileCheck -match-full-lines %s --check-prefix=FEATURES-CL20
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=clc++1.0 \
// RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES
// RUN: | FileCheck -match-full-lines %s --check-prefix=FEATURES-CL20
// For OpenCL C 2.0, header-only features can be disabled using macros.
// Features can be disabled using -cl-ext=-<feature>.
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL2.0 -fdeclare-opencl-builtins -finclude-default-header \
// RUN: -D__undef___opencl_c_integer_dot_product_input_4x8bit \
// RUN: -D__undef___opencl_c_integer_dot_product_input_4x8bit_packed \
// RUN: | FileCheck %s --check-prefix=NO-HEADERONLY-FEATURES-CL20
// For OpenCL C 3.0, header-only features can be disabled using macros.
// RUN: -cl-ext=-__opencl_c_integer_dot_product_input_4x8bit \
// RUN: -cl-ext=-__opencl_c_integer_dot_product_input_4x8bit_packed \
// RUN: | FileCheck %s --check-prefix=NO-FEATURES-CL20
// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 -fdeclare-opencl-builtins -finclude-default-header \
// RUN: -D__undef___opencl_c_work_group_collective_functions=1 \
// RUN: -D__undef___opencl_c_atomic_order_seq_cst=1 \
// RUN: -D__undef___opencl_c_atomic_scope_device=1 \
// RUN: -D__undef___opencl_c_atomic_scope_all_devices=1 \
// RUN: -D__undef___opencl_c_read_write_images=1 \
// RUN: | FileCheck %s --check-prefix=NO-HEADERONLY-FEATURES
// RUN: -cl-ext=-__opencl_c_work_group_collective_functions, \
// RUN: -cl-ext=-__opencl_c_atomic_order_seq_cst \
// RUN: -cl-ext=-__opencl_c_atomic_scope_device \
// RUN: -cl-ext=-__opencl_c_atomic_scope_all_devices \
// RUN: -cl-ext=-__opencl_c_read_write_images \
// RUN: | FileCheck %s --check-prefix=DISABLE-FEATURES
// Note that __opencl_c_int64 is always defined assuming
// always compiling for FULL OpenCL profile
@@ -47,34 +45,68 @@
// FEATURES: #define __opencl_c_3d_image_writes 1
// FEATURES: #define __opencl_c_atomic_order_acq_rel 1
// FEATURES: #define __opencl_c_atomic_order_seq_cst 1
// FEATURES: #define __opencl_c_atomic_scope_all_devices 1
// FEATURES: #define __opencl_c_atomic_scope_device 1
// FEATURES: #define __opencl_c_device_enqueue 1
// FEATURES: #define __opencl_c_ext_image_unorm_int_2_101010 1
// FEATURES: #define __opencl_c_ext_image_unsigned_10x6_12x4_14x2 1
// FEATURES: #define __opencl_c_fp64 1
// FEATURES: #define __opencl_c_generic_address_space 1
// FEATURES: #define __opencl_c_images 1
// FEATURES: #define __opencl_c_int64 1
// FEATURES: #define __opencl_c_integer_dot_product_input_4x8bit 1
// FEATURES: #define __opencl_c_integer_dot_product_input_4x8bit_packed 1
// FEATURES: #define __opencl_c_kernel_clock_scope_device 1
// FEATURES: #define __opencl_c_kernel_clock_scope_sub_group 1
// FEATURES: #define __opencl_c_kernel_clock_scope_work_group 1
// FEATURES: #define __opencl_c_pipes 1
// FEATURES: #define __opencl_c_program_scope_global_variables 1
// FEATURES: #define __opencl_c_read_write_images 1
// FEATURES: #define __opencl_c_subgroups 1
// FEATURES: #define __opencl_c_work_group_collective_functions 1
// FEATURES-CL20: #define __opencl_c_atomic_order_acq_rel 1
// FEATURES-CL20: #define __opencl_c_atomic_order_seq_cst 1
// FEATURES-CL20: #define __opencl_c_atomic_scope_all_devices 1
// FEATURES-CL20: #define __opencl_c_atomic_scope_device 1
// FEATURES-CL20: #define __opencl_c_device_enqueue 1
// FEATURES-CL20: #define __opencl_c_generic_address_space 1
// FEATURES-CL20: #define __opencl_c_images 1
// FEATURES-CL20: #define __opencl_c_int64 1
// FEATURES-CL20: #define __opencl_c_pipes 1
// FEATURES-CL20: #define __opencl_c_program_scope_global_variables 1
// FEATURES-CL20: #define __opencl_c_read_write_images 1
// FEATURES-CL20: #define __opencl_c_work_group_collective_functions 1
// NO-FEATURES: #define __opencl_c_int64 1
// NO-FEATURES-NOT: #define __opencl_c_3d_image_writes
// NO-FEATURES-NOT: #define __opencl_c_atomic_order_acq_rel
// NO-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst
// NO-FEATURES-NOT: #define __opencl_c_device_enqueue
// NO-FEATURES-NOT: #define __opencl_c_fp64
// NO-FEATURES-NOT: #define __opencl_c_generic_address_space
// NO-FEATURES-NOT: #define __opencl_c_images
// NO-FEATURES-NOT: #define __opencl_c_pipes
// NO-FEATURES-NOT: #define __opencl_c_program_scope_global_variables
// NO-FEATURES-NOT: #define __opencl_c_read_write_images
// NO-FEATURES-NOT: #define __opencl_c_subgroups
// NO-FEATURES-NOT: #define __opencl_c_3d_image_writes 1
// NO-FEATURES-NOT: #define __opencl_c_atomic_order_acq_rel 1
// NO-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst 1
// NO-FEATURES-NOT: #define __opencl_c_atomic_scope_all_devices 1
// NO-FEATURES-NOT: #define __opencl_c_atomic_scope_device 1
// NO-FEATURES-NOT: #define __opencl_c_device_enqueue 1
// NO-FEATURES-NOT: #define __opencl_c_ext_image_unorm_int_2_101010 1
// NO-FEATURES-NOT: #define __opencl_c_ext_image_unsigned_10x6_12x4_14x2 1
// NO-FEATURES-NOT: #define __opencl_c_fp64 1
// NO-FEATURES-NOT: #define __opencl_c_generic_address_space 1
// NO-FEATURES-NOT: #define __opencl_c_images 1
// NO-FEATURES-NOT: #define __opencl_c_int64 1
// NO-FEATURES-NOT: #define __opencl_c_integer_dot_product_input_4x8bit 1
// NO-FEATURES-NOT: #define __opencl_c_integer_dot_product_input_4x8bit_packed 1
// NO-FEATURES-NOT: #define __opencl_c_kernel_clock_scope_device 1
// NO-FEATURES-NOT: #define __opencl_c_kernel_clock_scope_sub_group 1
// NO-FEATURES-NOT: #define __opencl_c_kernel_clock_scope_work_group 1
// NO-FEATURES-NOT: #define __opencl_c_pipes 1
// NO-FEATURES-NOT: #define __opencl_c_program_scope_global_variables 1
// NO-FEATURES-NOT: #define __opencl_c_read_write_images 1
// NO-FEATURES-NOT: #define __opencl_c_subgroups 1
// NO-FEATURES-NOT: #define __opencl_c_work_group_collective_functions 1
// NO-HEADERONLY-FEATURES-CL20-NOT: #define __opencl_c_integer_dot_product_input_4x8bit
// NO-HEADERONLY-FEATURES-CL20-NOT: #define __opencl_c_integer_dot_product_input_4x8bit_packed
// NO-FEATURES-CL20-NOT: #define __opencl_c_integer_dot_product_input_4x8bit
// NO-FEATURES-CL20-NOT: #define __opencl_c_integer_dot_product_input_4x8bit_packed
// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_work_group_collective_functions
// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst
// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_scope_device
// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_scope_all_devices
// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_read_write_images
// DISABLE-FEATURES-NOT: #define __opencl_c_work_group_collective_functions
// DISABLE-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst
// DISABLE-FEATURES-NOT: #define __opencl_c_atomic_scope_all_devices
// DISABLE-FEATURES-NOT: #define __opencl_c_atomic_scope_device
// DISABLE-FEATURES-NOT: #define __opencl_c_read_write_images