|
1 |
| -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-DXIL |
2 |
| -// RUN-DISABLED: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SPIRV |
| 1 | +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -finclude-default-header -emit-llvm -disable-llvm-passes -o - %s | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,DXIL |
| 2 | +// RUN-DISABLED: %clang_cc1 -triple spirv-vulkan-library -finclude-default-header -emit-llvm -disable-llvm-passes -o - %s | llvm-cxxfilt | FileCheck %s --check-prefixes=CHECK,SPV |
3 | 3 |
|
4 | 4 | // NOTE: SPIRV codegen for resource methods is not yet implemented
|
5 | 5 |
|
6 | 6 | StructuredBuffer<float> SB1 : register(t0);
|
7 | 7 | RWStructuredBuffer<float> RWSB1 : register(u0);
|
8 |
| -RWStructuredBuffer<float> RWSB2 : register(u1); |
| 8 | +RWStructuredBuffer<uint4> RWSB2 : register(u1); |
9 | 9 | AppendStructuredBuffer<float> ASB : register(u2);
|
10 |
| -ConsumeStructuredBuffer<float> CSB : register(u3); |
| 10 | +ConsumeStructuredBuffer<double> CSB : register(u3); |
11 | 11 |
|
12 |
| -// CHECK: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", float, 0, 0) } |
13 |
| -// CHECK: %"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), target("dx.RawBuffer", float, 1, 0) } |
14 |
| -// CHECK: %"class.hlsl::AppendStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), target("dx.RawBuffer", float, 1, 0) } |
15 |
| -// CHECK: %"class.hlsl::ConsumeStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), target("dx.RawBuffer", float, 1, 0) } |
| 12 | +// DXIL: %"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", float, 0, 0) } |
| 13 | +// DXIL: %"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), target("dx.RawBuffer", float, 1, 0) } |
| 14 | +// DXIL: %"class.hlsl::RWStructuredBuffer.0" = type { target("dx.RawBuffer", <4 x i32>, 1, 0), target("dx.RawBuffer", <4 x i32>, 1, 0) } |
| 15 | +// DXIL: %"class.hlsl::AppendStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), target("dx.RawBuffer", float, 1, 0) } |
| 16 | +// DXIL: %"class.hlsl::ConsumeStructuredBuffer" = type { target("dx.RawBuffer", double, 1, 0), target("dx.RawBuffer", double, 1, 0) } |
16 | 17 |
|
17 | 18 | export int TestIncrementCounter() {
|
18 | 19 | return RWSB1.IncrementCounter();
|
19 | 20 | }
|
20 | 21 |
|
21 |
| -// CHECK: define noundef i32 @_Z20TestIncrementCounterv() |
22 |
| -// CHECK-DXIL: %[[INDEX:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 1) |
23 |
| -// CHECK-DXIL: ret i32 %[[INDEX]] |
| 22 | +// CHECK: define noundef i32 @TestIncrementCounter()() |
| 23 | +// CHECK: call noundef i32 @hlsl::RWStructuredBuffer<float>::IncrementCounter()(ptr {{.*}} @RWSB1) |
| 24 | +// CHECK: ret |
| 25 | + |
| 26 | +// CHECK: define {{.*}} noundef i32 @hlsl::RWStructuredBuffer<float>::IncrementCounter()(ptr {{.*}} %this) |
| 27 | +// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 28 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle, align 4 |
| 29 | +// DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i8 1) |
| 30 | +// CHECK-NEXT: ret i32 %[[COUNTER]] |
| 31 | + |
24 | 32 | export int TestDecrementCounter() {
|
25 | 33 | return RWSB2.DecrementCounter();
|
26 | 34 | }
|
| 35 | +// CHECK: define {{.*}} i32 @TestDecrementCounter()() |
| 36 | +// CHECK: call noundef i32 @hlsl::RWStructuredBuffer<unsigned int vector[4]>::DecrementCounter()(ptr {{.*}} @RWSB2) |
| 37 | +// CHECK: ret |
27 | 38 |
|
28 |
| -// CHECK: define noundef i32 @_Z20TestDecrementCounterv() |
29 |
| -// CHECK-DXIL: %[[INDEX:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 -1) |
30 |
| -// CHECK-DXIL: ret i32 %[[INDEX]] |
| 39 | +// CHECK: define {{.*}} noundef i32 @hlsl::RWStructuredBuffer<unsigned int vector[4]>::DecrementCounter()(ptr {{.*}} %this) |
| 40 | +// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer.0", ptr %{{.*}}, i32 0, i32 0 |
| 41 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", <4 x i32>, 1, 0), ptr %__handle, align 4 |
| 42 | +// DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_v4i32_1_0t(target("dx.RawBuffer", <4 x i32>, 1, 0) %[[HANDLE]], i8 -1) |
| 43 | +// CHECK-NEXT: ret i32 %[[COUNTER]] |
31 | 44 |
|
32 | 45 | export void TestAppend(float value) {
|
33 | 46 | ASB.Append(value);
|
34 | 47 | }
|
35 | 48 |
|
36 |
| -// CHECK: define void @_Z10TestAppendf(float noundef nofpclass(nan inf) %value) |
37 |
| -// CHECK-DXIL: %[[VALUE:.*]] = load float, ptr %value.addr, align 4 |
38 |
| -// CHECK-DXIL: %[[INDEX:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 1) |
39 |
| -// CHECK-DXIL: %[[RESPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i32 %[[INDEX]]) |
40 |
| -// CHECK-DXIL: store float %[[VALUE]], ptr %[[RESPTR]], align 4 |
| 49 | +// CHECK: define void @TestAppend(float)(float {{.*}} %value) |
| 50 | +// CHECK: call void @hlsl::AppendStructuredBuffer<float>::Append(float)(ptr {{.*}} @ASB, float noundef nofpclass(nan inf) %0) |
| 51 | +// CHECK: ret void |
| 52 | + |
| 53 | +// CHECK: define {{.*}} void @hlsl::AppendStructuredBuffer<float>::Append(float)(ptr {{.*}} %this, float noundef nofpclass(nan inf) %value) |
| 54 | +// CHECK: %[[VALUE:.*]] = load float, ptr %value.addr |
| 55 | +// CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::AppendStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 56 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle, align 4 |
| 57 | +// CHECK-NEXT: %__handle2 = getelementptr inbounds nuw %"class.hlsl::AppendStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 58 | +// DXIL-NEXT: %[[HANDLE2:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle2, align 4 |
| 59 | +// DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE2]], i8 1) |
| 60 | +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) |
| 61 | +// CHECK-NEXT: store float %[[VALUE]], ptr %[[PTR]], align 4 |
| 62 | +// CHECK-NEXT: ret void |
41 | 63 |
|
42 |
| -export float TestConsume() { |
| 64 | +export double TestConsume() { |
43 | 65 | return CSB.Consume();
|
44 | 66 | }
|
45 |
| - |
46 |
| -// CHECK: define noundef nofpclass(nan inf) float @_Z11TestConsumev() |
47 |
| -// CHECK-DXIL: %[[INDEX:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %1, i8 -1) |
48 |
| -// CHECK-DXIL: %[[RESPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %0, i32 %[[INDEX]]) |
49 |
| -// CHECK-DXIL: %[[VALUE:.*]] = load float, ptr %[[RESPTR]], align 4 |
50 |
| -// CHECK-DXIL: ret float %[[VALUE]] |
| 67 | +// CHECK: define {{.*}} double @TestConsume()() |
| 68 | +// CHECK: call {{.*}} double @hlsl::ConsumeStructuredBuffer<double>::Consume()(ptr {{.*}} @CSB) |
| 69 | +// CHECK: ret double |
| 70 | + |
| 71 | +// CHECK: define {{.*}} double @hlsl::ConsumeStructuredBuffer<double>::Consume()(ptr {{.*}} %this) |
| 72 | +// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::ConsumeStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 73 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", double, 1, 0), ptr %__handle, align 4 |
| 74 | +// CHECK-NEXT: %__handle2 = getelementptr inbounds nuw %"class.hlsl::ConsumeStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 75 | +// DXIL-NEXT: %[[HANDLE2:.*]] = load target("dx.RawBuffer", double, 1, 0), ptr %__handle2, align 4 |
| 76 | +// DXIL-NEXT: %[[COUNTER:.*]] = call i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0) %[[HANDLE2]], i8 -1) |
| 77 | +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0) %[[HANDLE]], i32 %[[COUNTER]]) |
| 78 | +// CHECK-NEXT: %[[VAL:.*]] = load double, ptr %[[PTR]], align 8 |
| 79 | +// CHECK-NEXT: ret double %[[VAL]] |
51 | 80 |
|
52 | 81 | export float TestLoad() {
|
53 | 82 | return RWSB1.Load(1) + SB1.Load(2);
|
54 | 83 | }
|
55 | 84 |
|
56 |
| -// CHECK: define noundef nofpclass(nan inf) float @_Z8TestLoadv() |
57 |
| -// CHECK: %[[PTR1:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i32 %{{[0-9]+}}) |
58 |
| -// CHECK: %[[VALUE1:.*]] = load float, ptr %[[PTR1]] |
59 |
| -// CHECK: %[[PTR2:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0) %{{[0-9]+}}, i32 %{{[0-9]+}}) |
60 |
| -// CHECK: %[[VALUE2:.*]] = load float, ptr %[[PTR2]] |
| 85 | +// CHECK: define noundef nofpclass(nan inf) float @TestLoad()() |
| 86 | +// CHECK: call {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int)(ptr {{.*}} @RWSB1, i32 noundef 1) |
| 87 | +// CHECK: call {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int)(ptr {{.*}} @SB1, i32 noundef 2) |
| 88 | +// CHECK: add |
| 89 | +// CHECK: ret float |
| 90 | + |
| 91 | +// CHECK: define {{.*}} float @hlsl::RWStructuredBuffer<float>::Load(unsigned int)(ptr {{.*}} %this, i32 noundef %Index) |
| 92 | +// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 93 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 1, 0), ptr %__handle, align 4 |
| 94 | +// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr, align 4 |
| 95 | +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], i32 %[[INDEX]]) |
| 96 | +// CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]], align 4 |
| 97 | +// CHECK-NEXT: ret float %[[VAL]] |
| 98 | + |
| 99 | +// CHECK: define {{.*}} float @hlsl::StructuredBuffer<float>::Load(unsigned int)(ptr {{.*}} %this, i32 noundef %Index) |
| 100 | +// CHECK: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0 |
| 101 | +// DXIL-NEXT: %[[HANDLE:.*]] = load target("dx.RawBuffer", float, 0, 0), ptr %__handle, align 4 |
| 102 | +// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr, align 4 |
| 103 | +// DXIL-NEXT: %[[PTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], i32 %[[INDEX]]) |
| 104 | +// CHECK-NEXT: %[[VAL:.*]] = load float, ptr %[[PTR]], align 4 |
| 105 | +// CHECK-NEXT: ret float %[[VAL]] |
61 | 106 |
|
62 |
| -// CHECK: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8) |
63 |
| -// CHECK: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i32) |
64 |
| -// CHECK: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0), i32) |
| 107 | +// DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8) |
| 108 | +// DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_v4i32_1_0t(target("dx.RawBuffer", <4 x i32>, 1, 0), i8) |
| 109 | +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i32) |
| 110 | +// DXIL: declare i32 @llvm.dx.resource.updatecounter.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0), i8) |
| 111 | +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f64_1_0t(target("dx.RawBuffer", double, 1, 0), i32) |
| 112 | +// DXIL: declare ptr @llvm.dx.resource.getpointer.p0.tdx.RawBuffer_f32_0_0t(target("dx.RawBuffer", float, 0, 0), i32) |
0 commit comments