blob: cdce8867dcd94faff9e77347e0101827f8e7e2d9 [file] [edit]
// RUN: %clang_cc1 -finclude-default-header -emit-llvm -disable-llvm-passes \
// RUN: -triple dxil-pc-shadermodel6.3-library %s -o - | FileCheck %s
// Test groupshared vector element store for uint.
// CHECK-LABEL: test_uint4
// CHECK: [[VAL:%.*]] = load i32, ptr %Val.addr, align 4
// CHECK: [[IDX:%.*]] = load i32, ptr %Idx.addr, align 4
// CHECK: [[PTR:%.*]] = getelementptr <4 x i32>, ptr addrspace(3) @SMem, i32 0, i32 [[IDX]]
// CHECK: store i32 [[VAL]], ptr addrspace(3) [[PTR]], align 4
// CHECK-: ret void
groupshared uint4 SMem;
void test_uint4(uint Idx, uint Val) {
SMem[Idx] = Val;
}
// Test local vector element store for bool.
// CHECK: [[COND1:%.*]] = load i32, ptr addrspace(3) @Cond, align 4
// CHECK: [[COND2:%.*]] = icmp ne i32 [[COND1]], 0
// CHECK: [[IDX:%.*]] = load i32, ptr %Idx.addr, align 4
// CHECK: [[COND3:%.*]] = zext i1 [[COND2]] to i32
// CHECK: [[PTR:%.*]] = getelementptr <3 x i32>, ptr %Val, i32 0, i32 [[IDX]]
// CHECK: store i32 [[COND3]], ptr [[PTR]], align 4
// CHECK: ret
groupshared bool Cond;
bool3 test_bool(uint Idx) {
bool3 Val = { false, false, false};
Val[Idx] = Cond;
return Val;
}
// Test resource vector element store for float.
// CHECK: [[VAL:%.*]] = load float, ptr %Val.addr, align 4
// CHECK: [[RES_PTR:%.*]] = call {{.*}} ptr @_ZNK4hlsl18RWStructuredBufferIDv4_fEixEj(ptr {{.*}} @_ZL3Buf, i32 noundef 0)
// CHECK: [[IDX:%.*]] = load i32, ptr %Idx.addr, align 4
// CHECK: [[PTR:%.*]] = getelementptr <4 x float>, ptr [[RES_PTR]], i32 0, i32 [[IDX]]
// CHECK: store float [[VAL]], ptr [[PTR]], align 4
// CHECK: ret void
RWStructuredBuffer<float4> Buf : register(u0);
void test_float(uint Idx, float Val) {
Buf[0][Idx] = Val;
}