|
| 1 | +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-compute -emit-llvm -disable-llvm-passes -o - %s \ |
| 2 | +// RUN: | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,DXIL |
| 3 | +// RUN: %clang_cc1 -finclude-default-header -triple spirv-pc-vulkan1.3-compute -emit-llvm -disable-llvm-passes -o - %s \ |
| 4 | +// RUN: | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SPV |
| 5 | + |
| 6 | +RWBuffer<float> A[10]; |
| 7 | + |
| 8 | +[numthreads(4,1,1)] |
| 9 | +void main(uint GI : SV_GroupID) { |
| 10 | + // CHECK: %[[GI:.*]] = load i32, ptr %GI.addr |
| 11 | + // CHECK: %[[NURI_1:.*]] = call {{.*}} i32 @hlsl::NonUniformResourceIndex(unsigned int)(i32 noundef %[[GI]]) |
| 12 | + // CHECK: call void @hlsl::RWBuffer<float>::__createFromImplicitBinding(unsigned int, unsigned int, int, unsigned int, char const*) |
| 13 | + // CHECK-SAME: (ptr {{.*}}, i32 noundef 0, i32 noundef 0, i32 noundef 10, i32 noundef %[[NURI_1]], ptr noundef @A.str) |
| 14 | + float a = A[NonUniformResourceIndex(GI)][0]; |
| 15 | + |
| 16 | + // CHECK: %[[GI:.*]] = load i32, ptr %GI.addr |
| 17 | + // CHECK: %[[ADD:.*]] = add i32 %[[GI]], 1 |
| 18 | + // CHECK: %[[NURI_2:.*]] = call {{.*}} i32 @hlsl::NonUniformResourceIndex(unsigned int)(i32 noundef %[[ADD]]) |
| 19 | + // CHECK: %[[MOD:.*]] = urem i32 %[[NURI_2]], 10 |
| 20 | + // CHECK: call void @hlsl::RWBuffer<float>::__createFromImplicitBinding(unsigned int, unsigned int, int, unsigned int, char const*) |
| 21 | + // CHECK-SAME: (ptr {{.*}}, i32 noundef 0, i32 noundef 0, i32 noundef 10, i32 noundef %[[MOD]], ptr noundef @A.str) |
| 22 | + float b = A[NonUniformResourceIndex(GI + 1) % 10][0]; |
| 23 | + |
| 24 | + // CHECK: %[[GI:.*]] = load i32, ptr %GI.addr |
| 25 | + // CHECK: %[[NURI_3:.*]] = call {{.*}} i32 @hlsl::NonUniformResourceIndex(unsigned int)(i32 noundef %[[GI]]) |
| 26 | + // CHECK: %[[MUL:.*]] = mul i32 3, %[[NURI_3]] |
| 27 | + // CHECK: %[[ADD2:.*]] = add i32 10, %[[MUL]] |
| 28 | + // CHECK: call void @hlsl::RWBuffer<float>::__createFromImplicitBinding(unsigned int, unsigned int, int, unsigned int, char const*) |
| 29 | + // CHECK-SAME: (ptr {{.*}}, i32 noundef 0, i32 noundef 0, i32 noundef 10, i32 noundef %[[ADD2]], ptr noundef @A.str) |
| 30 | + float c = A[10 + 3 * NonUniformResourceIndex(GI)][0]; |
| 31 | + A[0][0] = a + b + c; |
| 32 | +} |
| 33 | + |
| 34 | +// CHECK: define {{.*}} i32 @hlsl::NonUniformResourceIndex(unsigned int)(i32 noundef %Index) |
| 35 | +// CHECK: %[[INDEX1:.*]] = load i32, ptr %Index.addr, align 4 |
| 36 | +// DXIL: %[[INDEX2:.*]] = call i32 @llvm.dx.resource.nonuniformindex(i32 %[[INDEX1]]) |
| 37 | +// SPV: %[[INDEX2:.*]] = call i32 @llvm.spv.resource.nonuniformindex(i32 %[[INDEX1]]) |
| 38 | +// CHECK: ret i32 %[[INDEX2]] |
0 commit comments