1; RUN: opt -S -dxil-op-lower %s | FileCheck %s 2 3target triple = "dxil-pc-shadermodel6.6-compute" 4 5define void @storefloat(<4 x float> %data, i32 %index) { 6 7 ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, 8 ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] 9 %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) 10 @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( 11 i32 0, i32 0, i32 1, i32 0, i1 false) 12 13 ; The temporary casts should all have been cleaned up 14 ; CHECK-NOT: %dx.resource.casthandle 15 16 ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x float> %data, i32 0 17 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x float> %data, i32 1 18 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x float> %data, i32 2 19 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x float> %data, i32 3 20 ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, float [[DATA0_0]], float [[DATA0_1]], float [[DATA0_2]], float [[DATA0_3]], i8 15){{$}} 21 call void @llvm.dx.resource.store.typedbuffer( 22 target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, 23 i32 %index, <4 x float> %data) 24 25 ret void 26} 27 28define void @storeint(<4 x i32> %data, i32 %index) { 29 30 ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, 31 ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] 32 %buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) 33 @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_1_0_0( 34 i32 0, i32 0, i32 1, i32 0, i1 false) 35 36 ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i32> %data, i32 0 37 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i32> %data, i32 1 38 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i32> %data, i32 2 39 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i32> %data, i32 3 40 ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i32 [[DATA0_0]], i32 [[DATA0_1]], i32 [[DATA0_2]], i32 [[DATA0_3]], i8 15){{$}} 41 call void @llvm.dx.resource.store.typedbuffer( 42 target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) %buffer, 43 i32 %index, <4 x i32> %data) 44 45 ret void 46} 47 48define void @storehalf(<4 x half> %data, i32 %index) { 49 50 ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, 51 ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] 52 %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) 53 @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0( 54 i32 0, i32 0, i32 1, i32 0, i1 false) 55 56 ; The temporary casts should all have been cleaned up 57 ; CHECK-NOT: %dx.resource.casthandle 58 59 ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x half> %data, i32 0 60 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x half> %data, i32 1 61 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x half> %data, i32 2 62 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x half> %data, i32 3 63 ; CHECK: call void @dx.op.bufferStore.f16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, half [[DATA0_0]], half [[DATA0_1]], half [[DATA0_2]], half [[DATA0_3]], i8 15){{$}} 64 call void @llvm.dx.resource.store.typedbuffer( 65 target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %buffer, 66 i32 %index, <4 x half> %data) 67 68 ret void 69} 70 71define void @storei16(<4 x i16> %data, i32 %index) { 72 73 ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, 74 ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] 75 %buffer = call target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) 76 @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_1_0_0( 77 i32 0, i32 0, i32 1, i32 0, i1 false) 78 79 ; The temporary casts should all have been cleaned up 80 ; CHECK-NOT: %dx.resource.casthandle 81 82 ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i16> %data, i32 0 83 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i16> %data, i32 1 84 ; CHECK: [[DATA0_2:%.*]] = extractelement <4 x i16> %data, i32 2 85 ; CHECK: [[DATA0_3:%.*]] = extractelement <4 x i16> %data, i32 3 86 ; CHECK: call void @dx.op.bufferStore.i16(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, i16 [[DATA0_0]], i16 [[DATA0_1]], i16 [[DATA0_2]], i16 [[DATA0_3]], i8 15){{$}} 87 call void @llvm.dx.resource.store.typedbuffer( 88 target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) %buffer, 89 i32 %index, <4 x i16> %data) 90 91 ret void 92} 93 94define void @store_scalarized_floats(float %data0, float %data1, float %data2, float %data3, i32 %index) { 95 96 ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, 97 ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] 98 %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) 99 @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( 100 i32 0, i32 0, i32 1, i32 0, i1 false) 101 102 ; We shouldn't end up with any inserts/extracts. 103 ; CHECK-NOT: insertelement 104 ; CHECK-NOT: extractelement 105 106 ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle [[HANDLE]], i32 %index, i32 undef, float %data0, float %data1, float %data2, float %data3, i8 15) 107 %vec.upto0 = insertelement <4 x float> poison, float %data0, i64 0 108 %vec.upto1 = insertelement <4 x float> %vec.upto0, float %data1, i64 1 109 %vec.upto2 = insertelement <4 x float> %vec.upto1, float %data2, i64 2 110 %vec = insertelement <4 x float> %vec.upto2, float %data3, i64 3 111 call void @llvm.dx.resource.store.typedbuffer( 112 target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, 113 i32 %index, <4 x float> %vec) 114 115 ret void 116} 117