xref: /llvm-project/llvm/test/CodeGen/DirectX/BufferLoad.ll (revision 011b618644113996e2c0a8e57db40f89d20878e3)
13f22756fSJustin Bogner; RUN: opt -S -dxil-op-lower %s | FileCheck %s
23f22756fSJustin Bogner
33f22756fSJustin Bognertarget triple = "dxil-pc-shadermodel6.6-compute"
43f22756fSJustin Bogner
53f22756fSJustin Bognerdeclare void @scalar_user(float)
63f22756fSJustin Bognerdeclare void @vector_user(<4 x float>)
734e20f18SJustin Bognerdeclare void @check_user(i1)
83f22756fSJustin Bogner
93f22756fSJustin Bognerdefine void @loadv4f32() {
1019ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
1119ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
123f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0)
13aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0(
143f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
153f22756fSJustin Bogner
163f22756fSJustin Bogner  ; The temporary casts should all have been cleaned up
17aa07f922SJustin Bogner  ; CHECK-NOT: %dx.resource.casthandle
183f22756fSJustin Bogner
19*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR:]]
202c7c07dfSJustin Bogner  %load0 = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer(
213f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 0)
222c7c07dfSJustin Bogner  %data0 = extractvalue {<4 x float>, i1} %load0, 0
233f22756fSJustin Bogner
243f22756fSJustin Bogner  ; The extract order depends on the users, so don't enforce that here.
253f22756fSJustin Bogner  ; CHECK-DAG: [[VAL0_0:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 0
263f22756fSJustin Bogner  %data0_0 = extractelement <4 x float> %data0, i32 0
273f22756fSJustin Bogner  ; CHECK-DAG: [[VAL0_2:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 2
283f22756fSJustin Bogner  %data0_2 = extractelement <4 x float> %data0, i32 2
293f22756fSJustin Bogner
303f22756fSJustin Bogner  ; If all of the uses are extracts, we skip creating a vector
313f22756fSJustin Bogner  ; CHECK-NOT: insertelement
323f22756fSJustin Bogner  ; CHECK-DAG: call void @scalar_user(float [[VAL0_0]])
333f22756fSJustin Bogner  ; CHECK-DAG: call void @scalar_user(float [[VAL0_2]])
343f22756fSJustin Bogner  call void @scalar_user(float %data0_0)
353f22756fSJustin Bogner  call void @scalar_user(float %data0_2)
363f22756fSJustin Bogner
37*011b6186SFinn Plummer  ; CHECK: [[DATA4:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 4, i32 undef) #[[#ATTR]]
382c7c07dfSJustin Bogner  %load4 = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer(
393f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 4)
402c7c07dfSJustin Bogner  %data4 = extractvalue {<4 x float>, i1} %load4, 0
413f22756fSJustin Bogner
423f22756fSJustin Bogner  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA4]], 0
433f22756fSJustin Bogner  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA4]], 1
443f22756fSJustin Bogner  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA4]], 2
453f22756fSJustin Bogner  ; CHECK: extractvalue %dx.types.ResRet.f32 [[DATA4]], 3
463f22756fSJustin Bogner  ; CHECK: insertelement <4 x float> undef
473f22756fSJustin Bogner  ; CHECK: insertelement <4 x float>
483f22756fSJustin Bogner  ; CHECK: insertelement <4 x float>
493f22756fSJustin Bogner  ; CHECK: insertelement <4 x float>
503f22756fSJustin Bogner  call void @vector_user(<4 x float> %data4)
513f22756fSJustin Bogner
52*011b6186SFinn Plummer  ; CHECK: [[DATA12:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 12, i32 undef) #[[#ATTR]]
532c7c07dfSJustin Bogner  %load12 = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer(
543f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 12)
552c7c07dfSJustin Bogner  %data12 = extractvalue {<4 x float>, i1} %load12, 0
563f22756fSJustin Bogner
573f22756fSJustin Bogner  ; CHECK: [[DATA12_3:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA12]], 3
583f22756fSJustin Bogner  %data12_3 = extractelement <4 x float> %data12, i32 3
593f22756fSJustin Bogner
603f22756fSJustin Bogner  ; If there are a mix of users we need the vector, but extracts are direct
613f22756fSJustin Bogner  ; CHECK: call void @scalar_user(float [[DATA12_3]])
623f22756fSJustin Bogner  call void @scalar_user(float %data12_3)
633f22756fSJustin Bogner  call void @vector_user(<4 x float> %data12)
643f22756fSJustin Bogner
653f22756fSJustin Bogner  ret void
663f22756fSJustin Bogner}
673f22756fSJustin Bogner
683f22756fSJustin Bognerdefine void @index_dynamic(i32 %bufindex, i32 %elemindex) {
6919ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
7019ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
713f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0)
72aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0(
733f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
743f22756fSJustin Bogner
75*011b6186SFinn Plummer  ; CHECK: [[LOAD:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 %bufindex, i32 undef) #[[#ATTR]]
762c7c07dfSJustin Bogner  %load = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer(
773f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 %bufindex)
782c7c07dfSJustin Bogner  %data = extractvalue {<4 x float>, i1} %load, 0
793f22756fSJustin Bogner
803f22756fSJustin Bogner  ; CHECK: [[ALLOCA:%.*]] = alloca [4 x float]
813f22756fSJustin Bogner  ; CHECK: [[V0:%.*]] = extractvalue %dx.types.ResRet.f32 [[LOAD]], 0
823f22756fSJustin Bogner  ; CHECK: [[A0:%.*]] = getelementptr inbounds [4 x float], ptr [[ALLOCA]], i32 0, i32 0
833f22756fSJustin Bogner  ; CHECK: store float [[V0]], ptr [[A0]]
843f22756fSJustin Bogner  ; CHECK: [[V1:%.*]] = extractvalue %dx.types.ResRet.f32 [[LOAD]], 1
853f22756fSJustin Bogner  ; CHECK: [[A1:%.*]] = getelementptr inbounds [4 x float], ptr [[ALLOCA]], i32 0, i32 1
863f22756fSJustin Bogner  ; CHECK: store float [[V1]], ptr [[A1]]
873f22756fSJustin Bogner  ; CHECK: [[V2:%.*]] = extractvalue %dx.types.ResRet.f32 [[LOAD]], 2
883f22756fSJustin Bogner  ; CHECK: [[A2:%.*]] = getelementptr inbounds [4 x float], ptr [[ALLOCA]], i32 0, i32 2
893f22756fSJustin Bogner  ; CHECK: store float [[V2]], ptr [[A2]]
903f22756fSJustin Bogner  ; CHECK: [[V3:%.*]] = extractvalue %dx.types.ResRet.f32 [[LOAD]], 3
913f22756fSJustin Bogner  ; CHECK: [[A3:%.*]] = getelementptr inbounds [4 x float], ptr [[ALLOCA]], i32 0, i32 3
923f22756fSJustin Bogner  ; CHECK: store float [[V3]], ptr [[A3]]
933f22756fSJustin Bogner  ;
943f22756fSJustin Bogner  ; CHECK: [[PTR:%.*]] = getelementptr inbounds [4 x float], ptr [[ALLOCA]], i32 0, i32 %elemindex
953f22756fSJustin Bogner  ; CHECK: [[X:%.*]] = load float, ptr [[PTR]]
962c7c07dfSJustin Bogner  %x = extractelement <4 x float> %data, i32 %elemindex
973f22756fSJustin Bogner
983f22756fSJustin Bogner  ; CHECK: call void @scalar_user(float [[X]])
992c7c07dfSJustin Bogner  call void @scalar_user(float %x)
1003f22756fSJustin Bogner
1013f22756fSJustin Bogner  ret void
1023f22756fSJustin Bogner}
1033f22756fSJustin Bogner
1043f22756fSJustin Bognerdefine void @loadf32() {
10519ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
10619ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
1073f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", float, 0, 0, 0)
108aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_0_0_0(
1093f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1103f22756fSJustin Bogner
111*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1122c7c07dfSJustin Bogner  %load0 = call {float, i1} @llvm.dx.resource.load.typedbuffer(
1133f22756fSJustin Bogner      target("dx.TypedBuffer", float, 0, 0, 0) %buffer, i32 0)
1142c7c07dfSJustin Bogner  %data0 = extractvalue {float, i1} %load0, 0
1153f22756fSJustin Bogner
1163f22756fSJustin Bogner  ; CHECK: [[VAL0:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 0
1173f22756fSJustin Bogner  ; CHECK: call void @scalar_user(float [[VAL0]])
1183f22756fSJustin Bogner  call void @scalar_user(float %data0)
1193f22756fSJustin Bogner
1203f22756fSJustin Bogner  ret void
1213f22756fSJustin Bogner}
1223f22756fSJustin Bogner
1233f22756fSJustin Bognerdefine void @loadv2f32() {
12419ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
12519ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
1263f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <2 x float>, 0, 0, 0)
127aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f32_0_0_0(
1283f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1293f22756fSJustin Bogner
130*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1312c7c07dfSJustin Bogner  %data0 = call {<2 x float>, i1} @llvm.dx.resource.load.typedbuffer(
1323f22756fSJustin Bogner      target("dx.TypedBuffer", <2 x float>, 0, 0, 0) %buffer, i32 0)
1333f22756fSJustin Bogner
1343f22756fSJustin Bogner  ret void
1353f22756fSJustin Bogner}
1363f22756fSJustin Bogner
13734e20f18SJustin Bognerdefine void @loadv4f32_checkbit() {
13819ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
13919ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
14034e20f18SJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0)
141aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0(
14234e20f18SJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
14334e20f18SJustin Bogner
144*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1452c7c07dfSJustin Bogner  %data0 = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer.f32(
14634e20f18SJustin Bogner      target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i32 0)
14734e20f18SJustin Bogner
14834e20f18SJustin Bogner  ; CHECK: [[STATUS:%.*]] = extractvalue %dx.types.ResRet.f32 [[DATA0]], 4
149*011b6186SFinn Plummer  ; CHECK: [[MAPPED:%.*]] = call i1 @dx.op.checkAccessFullyMapped.i32(i32 71, i32 [[STATUS]]) #[[#ATTR]]
15034e20f18SJustin Bogner  %check = extractvalue {<4 x float>, i1} %data0, 1
15134e20f18SJustin Bogner
15234e20f18SJustin Bogner  ; CHECK: call void @check_user(i1 [[MAPPED]])
15334e20f18SJustin Bogner  call void @check_user(i1 %check)
15434e20f18SJustin Bogner
15534e20f18SJustin Bogner  ret void
15634e20f18SJustin Bogner}
15734e20f18SJustin Bogner
1583f22756fSJustin Bognerdefine void @loadv4i32() {
15919ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
16019ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
1613f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0)
162aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_0_0_0(
1633f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1643f22756fSJustin Bogner
165*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1662c7c07dfSJustin Bogner  %data0 = call {<4 x i32>, i1} @llvm.dx.resource.load.typedbuffer(
1673f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) %buffer, i32 0)
1683f22756fSJustin Bogner
1693f22756fSJustin Bogner  ret void
1703f22756fSJustin Bogner}
1713f22756fSJustin Bogner
1723f22756fSJustin Bognerdefine void @loadv4f16() {
17319ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
17419ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
1753f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x half>, 0, 0, 0)
176aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_0_0_0(
1773f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1783f22756fSJustin Bogner
179*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f16 @dx.op.bufferLoad.f16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1802c7c07dfSJustin Bogner  %data0 = call {<4 x half>, i1} @llvm.dx.resource.load.typedbuffer(
1813f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x half>, 0, 0, 0) %buffer, i32 0)
1823f22756fSJustin Bogner
1833f22756fSJustin Bogner  ret void
1843f22756fSJustin Bogner}
1853f22756fSJustin Bogner
1863f22756fSJustin Bognerdefine void @loadv4i16() {
18719ad7dd8SHelena Kotas  ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217,
18819ad7dd8SHelena Kotas  ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]]
1893f22756fSJustin Bogner  %buffer = call target("dx.TypedBuffer", <4 x i16>, 0, 0, 0)
190aa07f922SJustin Bogner      @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_0_0_0(
1913f22756fSJustin Bogner          i32 0, i32 0, i32 1, i32 0, i1 false)
1923f22756fSJustin Bogner
193*011b6186SFinn Plummer  ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i16 @dx.op.bufferLoad.i16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]]
1942c7c07dfSJustin Bogner  %data0 = call {<4 x i16>, i1} @llvm.dx.resource.load.typedbuffer(
1953f22756fSJustin Bogner      target("dx.TypedBuffer", <4 x i16>, 0, 0, 0) %buffer, i32 0)
1963f22756fSJustin Bogner
1973f22756fSJustin Bogner  ret void
1983f22756fSJustin Bogner}
199*011b6186SFinn Plummer
200*011b6186SFinn Plummer; CHECK: attributes #[[#ATTR]] = {{{.*}} memory(read) {{.*}}}
201