xref: /llvm-project/llvm/test/CodeGen/DirectX/BufferStore.ll (revision 011b618644113996e2c0a8e57db40f89d20878e3)
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