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