brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 21ca3f4 Raw
63 lines · plain
1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -finclude-default-header \2// RUN:   -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s3 4// This test verifies handling of local arrays of resources when used5// as a function argument that is modified inside the function.6 7// CHECK: @_ZL1X = internal global %"class.hlsl::RWBuffer" poison, align 48// CHECK: @_ZL1Y = internal global %"class.hlsl::RWBuffer" poison, align 49 10RWBuffer<int> X : register(u0);11RWBuffer<int> Y : register(u1);12 13// CHECK: define {{.*}} @_Z6SomeFnA2_N4hlsl8RWBufferIiEEji(14// CHECK-SAME: ptr noundef byval([2 x %"class.hlsl::RWBuffer"]) align 4 %B, i32 noundef %Idx, i32 noundef %Val0)15// CHECK-NEXT: entry:16// CHECK-NEXT: %[[Idx_addr:.*]] = alloca i32, align 417// CHECK-NEXT: %[[Val0_addr:.*]] = alloca i32, align 418// CHECK-NEXT: store i32 %Idx, ptr %[[Idx_addr]], align 419// CHECK-NEXT: store i32 %Val0, ptr %[[Val0_addr]], align 420void SomeFn(RWBuffer<int> B[2], uint Idx, int Val0) {21 22// CHECK-NEXT: %[[B_0_Ptr:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %B, i32 0, i32 023// CHECK-NEXT: call {{.*}} @_ZN4hlsl8RWBufferIiEaSERKS1_(ptr {{.*}} %[[B_0_Ptr]], ptr {{.*}} @_ZL1Y)24  B[0] = Y;25 26// NOTE: _ZN4hlsl8RWBufferIiEixEj is the subscript operator for RWBuffer<int>27 28// CHECK-NEXT: %[[Val0:.*]] = load i32, ptr %[[Val0_addr]], align 429// CHECK-NEXT: %[[B_0_Ptr:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %B, i32 0, i32 030// CHECK-NEXT: %[[Idx:.*]] = load i32, ptr %[[Idx_addr]], align 431// CHECK-NEXT: %[[BufPtr:.*]] = call {{.*}} ptr @_ZN4hlsl8RWBufferIiEixEj(ptr {{.*}} %[[B_0_Ptr]], i32 noundef %[[Idx]])32// CHECK-NEXT: store i32 %[[Val0]], ptr %[[BufPtr]], align 433  B[0][Idx] = Val0;34}35 36// CHECK: define {{.*}} void @_Z4mainj(i32 noundef %GI)37// CHECK-NEXT: entry:38// CHECK-NEXT: %[[GI_addr:.*]] = alloca i32, align 439[numthreads(4,1,1)]40void main(uint GI : SV_GroupIndex) {41// CHECK-NEXT: %A = alloca [2 x %"class.hlsl::RWBuffer"], align 442// CHECK-NEXT: %[[Tmp:.*]] = alloca [2 x %"class.hlsl::RWBuffer"], align 443// CHECK-NEXT: store i32 %GI, ptr %GI.addr, align 444 45// Initialization of array A with resources X and Y46// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIiEC1ERKS1_(ptr {{.*}} %A, ptr {{.*}} @_ZL1X)47// CHECK-NEXT: %[[A_1_Ptr:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %A, i32 148// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIiEC1ERKS1_(ptr {{.*}} %[[A_1_Ptr]], ptr {{.*}} @_ZL1Y)49  RWBuffer<int> A[2] = {X, Y};50 51// Verify that SomeFn is called with a local copy of the array A52// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Tmp]], ptr align 4 %A, i32 8, i1 false)53// CHECK-NEXT: %[[GI:.*]] = load i32, ptr %[[GI_addr]], align 454// CHECK-NEXT: call void @_Z6SomeFnA2_N4hlsl8RWBufferIiEEji(ptr noundef byval([2 x %"class.hlsl::RWBuffer"]) align 4 %[[Tmp]], i32 noundef %[[GI]], i32 noundef 1)55  SomeFn(A, GI, 1);56 57// CHECK-NEXT: %[[A_0_Ptr:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %A, i32 0, i32 058// CHECK-NEXT: %[[GI:.*]] = load i32, ptr %[[GI_addr]], align 459// CHECK-NEXT: %[[BufPtr:.*]] = call {{.*}} ptr @_ZN4hlsl8RWBufferIiEixEj(ptr {{.*}} %[[A_0_Ptr]], i32 noundef %[[GI]])60// CHECK-NEXT: store i32 2, ptr %[[BufPtr]], align 461  A[0][GI] = 2;62}63