|
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 |
| 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 |
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<uint4> RWSB2 : register(u1); |
| 8 | +RWStructuredBuffer<float> RWSB2 : register(u1); |
9 | 9 | AppendStructuredBuffer<float> ASB : register(u2); |
10 | | -ConsumeStructuredBuffer<double> CSB : register(u3); |
| 10 | +ConsumeStructuredBuffer<float> CSB : register(u3); |
11 | 11 |
|
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) } |
| 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) } |
17 | 16 |
|
18 | 17 | export int TestIncrementCounter() { |
19 | 18 | return RWSB1.IncrementCounter(); |
20 | 19 | } |
21 | 20 |
|
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 |
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 | | - |
| 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]] |
32 | 24 | export int TestDecrementCounter() { |
33 | 25 | return RWSB2.DecrementCounter(); |
34 | 26 | } |
35 | | -// CHECK: define {{.*}} i32 @TestDecrementCounter()() |
36 | | -// CHECK: call noundef i32 @hlsl::RWStructuredBuffer<unsigned int vector[4]>::DecrementCounter()(ptr {{.*}} @RWSB2) |
37 | | -// CHECK: ret |
38 | 27 |
|
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 |
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]] |
| 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]] |
44 | 31 |
|
45 | 32 | export void TestAppend(float value) { |
46 | 33 | ASB.Append(value); |
47 | 34 | } |
48 | 35 |
|
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 |
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 |
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]] |
62 | | -// CHECK-NEXT: ret void |
| 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 |
63 | 41 |
|
64 | | -export double TestConsume() { |
| 42 | +export float TestConsume() { |
65 | 43 | return CSB.Consume(); |
66 | 44 | } |
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 |
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 |
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]] |
| 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]] |
80 | 51 |
|
81 | 52 | export float TestLoad() { |
82 | 53 | return RWSB1.Load(1) + SB1.Load(2); |
83 | 54 | } |
84 | 55 |
|
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 |
94 | | -// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr |
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]] |
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 |
102 | | -// CHECK-NEXT: %[[INDEX:.*]] = load i32, ptr %Index.addr |
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]] |
105 | | -// CHECK-NEXT: ret float %[[VAL]] |
| 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]] |
106 | 61 |
|
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) |
| 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) |
0 commit comments