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