xref: /llvm-project/llvm/test/CodeGen/DirectX/RawBufferLoad.ll (revision cba9bd5cb07717daabcddd9850957b3a1cfe3e47)
1; RUN: opt -S -dxil-op-lower %s | FileCheck %s
2
3target triple = "dxil-pc-shadermodel6.6-compute"
4
5declare void @f32_user(float)
6declare void @v4f32_user(<4 x float>)
7declare void @i32_user(i32)
8declare void @v4i32_user(<4 x i32>)
9declare void @v3f16_user(<3 x half>)
10declare void @v4f64_user(<4 x double>)
11
12; CHECK-LABEL: define void @loadf32_struct
13define void @loadf32_struct(i32 %index) {
14  %buffer = call target("dx.RawBuffer", float, 0, 0, 0)
15      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0(
16          i32 0, i32 0, i32 1, i32 0, i1 false)
17
18  ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4)
19  %load = call {float, i1}
20      @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_f32_0_0_0t(
21          target("dx.RawBuffer", float, 0, 0, 0) %buffer,
22          i32 %index,
23          i32 0)
24  %data = extractvalue {float, i1} %load, 0
25
26  ; CHECK: [[VAL:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA]], 0
27  ; CHECK: call void @f32_user(float [[VAL]])
28  call void @f32_user(float %data)
29
30  ret void
31}
32
33; CHECK-LABEL: define void @loadf32_byte
34define void @loadf32_byte(i32 %offset) {
35  %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)
36      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(
37          i32 0, i32 0, i32 1, i32 0, i1 false)
38
39  ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 1, i32 4)
40  %load = call {float, i1}
41      @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_i8_0_0_0t(
42          target("dx.RawBuffer", i8, 0, 0, 0) %buffer,
43          i32 %offset,
44          i32 0)
45  %data = extractvalue {float, i1} %load, 0
46
47  ; CHECK: [[VAL:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA]], 0
48  ; CHECK: call void @f32_user(float [[VAL]])
49  call void @f32_user(float %data)
50
51  ret void
52}
53
54; CHECK-LABEL: define void @loadv4f32_struct
55define void @loadv4f32_struct(i32 %index) {
56  %buffer = call target("dx.RawBuffer", <4 x float>, 0, 0, 0)
57      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0(
58          i32 0, i32 0, i32 1, i32 0, i1 false)
59
60  ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4)
61  %load = call {<4 x float>, i1}
62      @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_v4f32_0_0_0t(
63          target("dx.RawBuffer", <4 x float>, 0, 0, 0) %buffer,
64          i32 %index,
65          i32 0)
66  %data = extractvalue {<4 x float>, i1} %load, 0
67
68  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 0
69  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 1
70  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 2
71  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 3
72  ; CHECK: insertelement <4 x float> undef
73  ; CHECK: insertelement <4 x float>
74  ; CHECK: insertelement <4 x float>
75  ; CHECK: insertelement <4 x float>
76  ; CHECK: call void @v4f32_user(<4 x float>
77  call void @v4f32_user(<4 x float> %data)
78
79  ret void
80}
81
82; CHECK-LABEL: define void @loadv4f32_byte
83define void @loadv4f32_byte(i32 %offset) {
84  %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)
85      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(
86          i32 0, i32 0, i32 1, i32 0, i1 false)
87
88  ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 4)
89  %load = call {<4 x float>, i1}
90      @llvm.dx.resource.load.rawbuffer.f32.tdx.RawBuffer_i8_0_0_0t(
91          target("dx.RawBuffer", i8, 0, 0, 0) %buffer,
92          i32 %offset,
93          i32 0)
94  %data = extractvalue {<4 x float>, i1} %load, 0
95
96  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 0
97  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 1
98  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 2
99  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA]], 3
100  ; CHECK: insertelement <4 x float> undef
101  ; CHECK: insertelement <4 x float>
102  ; CHECK: insertelement <4 x float>
103  ; CHECK: insertelement <4 x float>
104  ; CHECK: call void @v4f32_user(<4 x float>
105  call void @v4f32_user(<4 x float> %data)
106
107  ret void
108}
109
110; CHECK-LABEL: define void @loadelements
111define void @loadelements(i32 %index) {
112  %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0)
113      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0(
114          i32 0, i32 0, i32 1, i32 0, i1 false)
115
116  ; CHECK: [[DATAF32:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4)
117  %loadf32 = call {<4 x float>, i1}
118      @llvm.dx.resource.load.rawbuffer.v4f32(
119          target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) %buffer,
120          i32 %index,
121          i32 0)
122  %dataf32 = extractvalue {<4 x float>, i1} %loadf32, 0
123
124  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 0
125  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 1
126  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 2
127  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 3
128  ; CHECK: insertelement <4 x float> undef
129  ; CHECK: insertelement <4 x float>
130  ; CHECK: insertelement <4 x float>
131  ; CHECK: insertelement <4 x float>
132  ; CHECK: call void @v4f32_user(<4 x float>
133  call void @v4f32_user(<4 x float> %dataf32)
134
135  ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 1, i8 15, i32 4)
136  %loadi32 = call {<4 x i32>, i1}
137      @llvm.dx.resource.load.rawbuffer.v4i32(
138          target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) %buffer,
139          i32 %index,
140          i32 1)
141  %datai32 = extractvalue {<4 x i32>, i1} %loadi32, 0
142
143  ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 0
144  ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 1
145  ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 2
146  ; CHECK: extractvalue %dx.types.ResRet.i32 [[DATAI32]], 3
147  ; CHECK: insertelement <4 x i32> undef
148  ; CHECK: insertelement <4 x i32>
149  ; CHECK: insertelement <4 x i32>
150  ; CHECK: insertelement <4 x i32>
151  ; CHECK: call void @v4i32_user(<4 x i32>
152  call void @v4i32_user(<4 x i32> %datai32)
153
154  ret void
155}
156
157; CHECK-LABEL: define void @loadnested
158define void @loadnested(i32 %index) {
159  %buffer = call
160      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0)
161      @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false)
162
163  ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4)
164  %loadi32 = call {i32, i1} @llvm.dx.resource.load.rawbuffer.i32(
165      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,
166      i32 %index, i32 0)
167  %datai32 = extractvalue {i32, i1} %loadi32, 0
168
169  ; CHECK: [[VALI32:%.*]] = extractvalue %dx.types.ResRet.i32 [[DATAI32]], 0
170  ; CHECK: call void @i32_user(i32 [[VALI32]])
171  call void @i32_user(i32 %datai32)
172
173  ; CHECK: [[DATAF32:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 4, i8 15, i32 4)
174  %loadf32 = call {<4 x float>, i1} @llvm.dx.resource.load.rawbuffer.v4f32(
175      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,
176      i32 %index, i32 4)
177  %dataf32 = extractvalue {<4 x float>, i1} %loadf32, 0
178
179  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 0
180  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 1
181  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 2
182  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATAF32]], 3
183  ; CHECK: insertelement <4 x float> undef
184  ; CHECK: insertelement <4 x float>
185  ; CHECK: insertelement <4 x float>
186  ; CHECK: insertelement <4 x float>
187  ; CHECK: call void @v4f32_user(<4 x float>
188  call void @v4f32_user(<4 x float> %dataf32)
189
190  ; CHECK: [[DATAF16:%.*]] = call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 20, i8 7, i32 2)
191  %loadf16 = call {<3 x half>, i1} @llvm.dx.resource.load.rawbuffer.v3f16(
192      target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) %buffer,
193      i32 %index, i32 20)
194  %dataf16 = extractvalue {<3 x half>, i1} %loadf16, 0
195
196  ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 0
197  ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 1
198  ; CHECK: extractvalue %dx.types.ResRet.f16 [[DATAF16]], 2
199  ; CHECK: insertelement <3 x half> undef
200  ; CHECK: insertelement <3 x half>
201  ; CHECK: insertelement <3 x half>
202  ; CHECK: call void @v3f16_user(<3 x half>
203  call void @v3f16_user(<3 x half> %dataf16)
204
205  ret void
206}
207
208; byteaddressbuf.Load<int64_t4>
209; CHECK-LABEL: define void @loadv4f64_byte
210define void @loadv4f64_byte(i32 %offset) {
211  %buffer = call target("dx.RawBuffer", i8, 0, 0, 0)
212      @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0(
213          i32 0, i32 0, i32 1, i32 0, i1 false)
214
215  ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 8)
216  %load = call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer.v4i64(
217      target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0)
218  %data = extractvalue {<4 x double>, i1} %load, 0
219
220  ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 0
221  ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 1
222  ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 2
223  ; CHECK: extractvalue %dx.types.ResRet.f64 [[DATA]], 3
224  ; CHECK: insertelement <4 x double> undef
225  ; CHECK: insertelement <4 x double>
226  ; CHECK: insertelement <4 x double>
227  ; CHECK: insertelement <4 x double>
228  ; CHECK: call void @v4f64_user(<4 x double>
229  call void @v4f64_user(<4 x double> %data)
230
231  ret void
232}
233