mirror-llvm-project/clang/test/SemaHIP/builtins-amdgcn-buffer-format.hip
Matt Arsenault b03b97b828 clang/AMDGPU: Require 16-bit-insts for half typed buffer format builtins
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>
2026-08-01 21:42:57 +02:00

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}}
}