Typed buffer format load/store operations with 16-bit elements require d16 support which was introduced in gfx8. These builtins previously had no required features at all, so they were accepted (and then crashed the backend) on targets without 16-bit support. Diagnose these in Sema, parallel to the image builtins. The manual verification here suprised me. The automatic builtin feature verification is enforced in codegen, which seems like a layering violation which should be fixed. Co-Authored-By: Claude (Opus 4.8) <noreply@anthropic.com>
46 lines
4 KiB
Text
46 lines
4 KiB
Text
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
|
|
// RUN: %clang_cc1 -fsyntax-only -triple amdgpu8.03 -verify %s -fcuda-is-device
|
|
// REQUIRES: amdgpu-registered-target
|
|
|
|
#define __device__ __attribute__((device))
|
|
|
|
typedef float v4f32 __attribute__((ext_vector_type(4)));
|
|
typedef _Float16 v4f16 __attribute__((ext_vector_type(4)));
|
|
|
|
__device__ void test_raw_buffer_format(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata_f32, v4f16 vdata_f16, int offset, int soffset) {
|
|
v4f32 ld_f32 = __builtin_amdgcn_raw_buffer_load_format_v4f32(rsrc, offset, soffset, 0);
|
|
v4f16 ld_f16 = __builtin_amdgcn_raw_buffer_load_format_v4f16(rsrc, offset, soffset, 0);
|
|
__builtin_amdgcn_raw_buffer_store_format_v4f32(vdata_f32, rsrc, offset, soffset, 0);
|
|
__builtin_amdgcn_raw_buffer_store_format_v4f16(vdata_f16, rsrc, offset, soffset, 0);
|
|
}
|
|
|
|
__device__ void test_struct_buffer_format(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata_f32, v4f16 vdata_f16, int vindex, int offset, int soffset) {
|
|
v4f32 ld_f32 = __builtin_amdgcn_struct_buffer_load_format_v4f32(rsrc, vindex, offset, soffset, 0);
|
|
v4f16 ld_f16 = __builtin_amdgcn_struct_buffer_load_format_v4f16(rsrc, vindex, offset, soffset, 0);
|
|
__builtin_amdgcn_struct_buffer_store_format_v4f32(vdata_f32, rsrc, vindex, offset, soffset, 0);
|
|
__builtin_amdgcn_struct_buffer_store_format_v4f16(vdata_f16, rsrc, vindex, offset, soffset, 0);
|
|
}
|
|
|
|
__device__ void test_raw_buffer_format_err(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata_f32, v4f16 vdata_f16, int offset, int soffset, int aux) {
|
|
__builtin_amdgcn_raw_buffer_load_format_v4f32(rsrc, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_raw_buffer_load_format_v4f32' must be a constant integer}}
|
|
__builtin_amdgcn_raw_buffer_load_format_v4f16(rsrc, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_raw_buffer_load_format_v4f16' must be a constant integer}}
|
|
__builtin_amdgcn_raw_buffer_store_format_v4f32(vdata_f32, rsrc, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_raw_buffer_store_format_v4f32' must be a constant integer}}
|
|
__builtin_amdgcn_raw_buffer_store_format_v4f16(vdata_f16, rsrc, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_raw_buffer_store_format_v4f16' must be a constant integer}}
|
|
}
|
|
|
|
__device__ void test_struct_buffer_format_err(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata_f32, v4f16 vdata_f16, int vindex, int offset, int soffset, int aux) {
|
|
__builtin_amdgcn_struct_buffer_load_format_v4f32(rsrc, vindex, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_struct_buffer_load_format_v4f32' must be a constant integer}}
|
|
__builtin_amdgcn_struct_buffer_load_format_v4f16(rsrc, vindex, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_struct_buffer_load_format_v4f16' must be a constant integer}}
|
|
__builtin_amdgcn_struct_buffer_store_format_v4f32(vdata_f32, rsrc, vindex, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_struct_buffer_store_format_v4f32' must be a constant integer}}
|
|
__builtin_amdgcn_struct_buffer_store_format_v4f16(vdata_f16, rsrc, vindex, offset, soffset, aux); // expected-error{{argument to '__builtin_amdgcn_struct_buffer_store_format_v4f16' must be a constant integer}}
|
|
}
|
|
|
|
__device__ void test_raw_buffer_format_too_many_args(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata, int offset, int soffset) {
|
|
__builtin_amdgcn_raw_buffer_load_format_v4f32(rsrc, offset, soffset, 0, 4); // expected-error{{too many arguments to function call}}
|
|
__builtin_amdgcn_raw_buffer_store_format_v4f32(vdata, rsrc, offset, soffset, 0, 4); // expected-error{{too many arguments to function call}}
|
|
}
|
|
|
|
__device__ void test_struct_buffer_format_too_many_args(__amdgpu_buffer_rsrc_t rsrc, v4f32 vdata, int vindex, int offset, int soffset) {
|
|
__builtin_amdgcn_struct_buffer_load_format_v4f32(rsrc, vindex, offset, soffset, 0, 4); // expected-error{{too many arguments to function call}}
|
|
__builtin_amdgcn_struct_buffer_store_format_v4f32(vdata, rsrc, vindex, offset, soffset, 0, 4); // expected-error{{too many arguments to function call}}
|
|
}
|