// 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 Buf : register(u0); void test_float(uint Idx, float Val) { Buf[0][Idx] = Val; }