Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / combine-store.ll
blob5c4cc00a969580afd37383549336d55b3e690a16
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV32 %s
3 ; RUN: llc -mtriple=riscv64 -mattr=+d,+v -verify-machineinstrs < %s | FileCheck --check-prefixes=CHECK,RV64 %s
5 define void @combine_zero_stores_2xi8(ptr %p) {
6 ; CHECK-LABEL: combine_zero_stores_2xi8:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    sh zero, 0(a0)
9 ; CHECK-NEXT:    ret
10   store i8 zeroinitializer, ptr %p, align 2
11   %gep = getelementptr i8, ptr %p, i64 1
12   store i8 zeroinitializer, ptr %gep
13   ret void
16 define void @combine_zero_stores_4xi8(ptr %p) {
17 ; CHECK-LABEL: combine_zero_stores_4xi8:
18 ; CHECK:       # %bb.0:
19 ; CHECK-NEXT:    sw zero, 0(a0)
20 ; CHECK-NEXT:    ret
21   store i8 zeroinitializer, ptr %p, align 4
22   %gep1 = getelementptr i8, ptr %p, i64 1
23   store i8 zeroinitializer, ptr %gep1
24   %gep2 = getelementptr i8, ptr %p, i64 2
25   store i8 zeroinitializer, ptr %gep2
26   %gep3 = getelementptr i8, ptr %p, i64 3
27   store i8 zeroinitializer, ptr %gep3
28   ret void
31 define void @combine_zero_stores_8xi8(ptr %p) {
32 ; RV32-LABEL: combine_zero_stores_8xi8:
33 ; RV32:       # %bb.0:
34 ; RV32-NEXT:    sw zero, 0(a0)
35 ; RV32-NEXT:    sw zero, 4(a0)
36 ; RV32-NEXT:    ret
38 ; RV64-LABEL: combine_zero_stores_8xi8:
39 ; RV64:       # %bb.0:
40 ; RV64-NEXT:    sd zero, 0(a0)
41 ; RV64-NEXT:    ret
42   store i8 zeroinitializer, ptr %p, align 8
43   %gep1 = getelementptr i8, ptr %p, i64 1
44   store i8 zeroinitializer, ptr %gep1
45   %gep2 = getelementptr i8, ptr %p, i64 2
46   store i8 zeroinitializer, ptr %gep2
47   %gep3 = getelementptr i8, ptr %p, i64 3
48   store i8 zeroinitializer, ptr %gep3
49   %gep4 = getelementptr i8, ptr %p, i64 4
50   store i8 zeroinitializer, ptr %gep4, align 8
51   %gep5 = getelementptr i8, ptr %p, i64 5
52   store i8 zeroinitializer, ptr %gep5
53   %gep6 = getelementptr i8, ptr %p, i64 6
54   store i8 zeroinitializer, ptr %gep6
55   %gep7 = getelementptr i8, ptr %p, i64 7
56   store i8 zeroinitializer, ptr %gep7
57   ret void
60 define void @combine_zero_stores_2xi16(ptr %p) {
61 ; CHECK-LABEL: combine_zero_stores_2xi16:
62 ; CHECK:       # %bb.0:
63 ; CHECK-NEXT:    sw zero, 0(a0)
64 ; CHECK-NEXT:    ret
65   store i16 zeroinitializer, ptr %p, align 4
66   %gep = getelementptr i8, ptr %p, i64 2
67   store i16 zeroinitializer, ptr %gep
68   ret void
71 define void @combine_zero_stores_4xi16(ptr %p) {
72 ; RV32-LABEL: combine_zero_stores_4xi16:
73 ; RV32:       # %bb.0:
74 ; RV32-NEXT:    sw zero, 0(a0)
75 ; RV32-NEXT:    sw zero, 4(a0)
76 ; RV32-NEXT:    ret
78 ; RV64-LABEL: combine_zero_stores_4xi16:
79 ; RV64:       # %bb.0:
80 ; RV64-NEXT:    sd zero, 0(a0)
81 ; RV64-NEXT:    ret
82   store i16 zeroinitializer, ptr %p, align 8
83   %gep1 = getelementptr i16, ptr %p, i64 1
84   store i16 zeroinitializer, ptr %gep1
85   %gep2 = getelementptr i16, ptr %p, i64 2
86   store i16 zeroinitializer, ptr %gep2, align 4
87   %gep3 = getelementptr i16, ptr %p, i64 3
88   store i16 zeroinitializer, ptr %gep3
89   ret void
92 define void @combine_zero_stores_8xi16(ptr %p) {
93 ; RV32-LABEL: combine_zero_stores_8xi16:
94 ; RV32:       # %bb.0:
95 ; RV32-NEXT:    sw zero, 0(a0)
96 ; RV32-NEXT:    sh zero, 4(a0)
97 ; RV32-NEXT:    sh zero, 6(a0)
98 ; RV32-NEXT:    sw zero, 8(a0)
99 ; RV32-NEXT:    sh zero, 12(a0)
100 ; RV32-NEXT:    sh zero, 14(a0)
101 ; RV32-NEXT:    ret
103 ; RV64-LABEL: combine_zero_stores_8xi16:
104 ; RV64:       # %bb.0:
105 ; RV64-NEXT:    sd zero, 0(a0)
106 ; RV64-NEXT:    sd zero, 8(a0)
107 ; RV64-NEXT:    ret
108   store i16 zeroinitializer, ptr %p, align 16
109   %gep1 = getelementptr i16, ptr %p, i64 1
110   store i16 zeroinitializer, ptr %gep1
111   %gep2 = getelementptr i16, ptr %p, i64 2
112   store i16 zeroinitializer, ptr %gep2
113   %gep3 = getelementptr i16, ptr %p, i64 3
114   store i16 zeroinitializer, ptr %gep3
115   %gep4 = getelementptr i16, ptr %p, i64 4
116   store i16 zeroinitializer, ptr %gep4, align 8
117   %gep5 = getelementptr i16, ptr %p, i64 5
118   store i16 zeroinitializer, ptr %gep5
119   %gep6 = getelementptr i16, ptr %p, i64 6
120   store i16 zeroinitializer, ptr %gep6
121   %gep7 = getelementptr i16, ptr %p, i64 7
122   store i16 zeroinitializer, ptr %gep7
123   ret void
126 define void @combine_zero_stores_2xi32(ptr %p) {
127 ; RV32-LABEL: combine_zero_stores_2xi32:
128 ; RV32:       # %bb.0:
129 ; RV32-NEXT:    sw zero, 0(a0)
130 ; RV32-NEXT:    sw zero, 4(a0)
131 ; RV32-NEXT:    ret
133 ; RV64-LABEL: combine_zero_stores_2xi32:
134 ; RV64:       # %bb.0:
135 ; RV64-NEXT:    sd zero, 0(a0)
136 ; RV64-NEXT:    ret
137   store i32 zeroinitializer, ptr %p, align 8
138   %gep = getelementptr i8, ptr %p, i64 4
139   store i32 zeroinitializer, ptr %gep
140   ret void
143 define void @combine_zero_stores_4xi32(ptr %p) {
144 ; RV32-LABEL: combine_zero_stores_4xi32:
145 ; RV32:       # %bb.0:
146 ; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
147 ; RV32-NEXT:    vmv.v.i v8, 0
148 ; RV32-NEXT:    vse32.v v8, (a0)
149 ; RV32-NEXT:    ret
151 ; RV64-LABEL: combine_zero_stores_4xi32:
152 ; RV64:       # %bb.0:
153 ; RV64-NEXT:    sd zero, 0(a0)
154 ; RV64-NEXT:    sd zero, 8(a0)
155 ; RV64-NEXT:    ret
156   store i32 zeroinitializer, ptr %p, align 16
157   %gep1 = getelementptr i32, ptr %p, i64 1
158   store i32 zeroinitializer, ptr %gep1
159   %gep2 = getelementptr i32, ptr %p, i64 2
160   store i32 zeroinitializer, ptr %gep2, align 8
161   %gep3 = getelementptr i32, ptr %p, i64 3
162   store i32 zeroinitializer, ptr %gep3
163   ret void
166 define void @combine_zero_stores_8xi32(ptr %p) {
167 ; RV32-LABEL: combine_zero_stores_8xi32:
168 ; RV32:       # %bb.0:
169 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
170 ; RV32-NEXT:    vmv.v.i v8, 0
171 ; RV32-NEXT:    vse32.v v8, (a0)
172 ; RV32-NEXT:    ret
174 ; RV64-LABEL: combine_zero_stores_8xi32:
175 ; RV64:       # %bb.0:
176 ; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
177 ; RV64-NEXT:    vmv.v.i v8, 0
178 ; RV64-NEXT:    vse64.v v8, (a0)
179 ; RV64-NEXT:    ret
180   store i32 zeroinitializer, ptr %p, align 32
181   %gep1 = getelementptr i32, ptr %p, i64 1
182   store i32 zeroinitializer, ptr %gep1
183   %gep2 = getelementptr i32, ptr %p, i64 2
184   store i32 zeroinitializer, ptr %gep2, align 8
185   %gep3 = getelementptr i32, ptr %p, i64 3
186   store i32 zeroinitializer, ptr %gep3
187   %gep4 = getelementptr i32, ptr %p, i64 4
188   store i32 zeroinitializer, ptr %gep4, align 8
189   %gep5 = getelementptr i32, ptr %p, i64 5
190   store i32 zeroinitializer, ptr %gep5
191   %gep6 = getelementptr i32, ptr %p, i64 6
192   store i32 zeroinitializer, ptr %gep6, align 8
193   %gep7 = getelementptr i32, ptr %p, i64 7
194   store i32 zeroinitializer, ptr %gep7
195   ret void
198 define void @combine_zero_stores_2xi32_unaligned(ptr %p) {
199 ; CHECK-LABEL: combine_zero_stores_2xi32_unaligned:
200 ; CHECK:       # %bb.0:
201 ; CHECK-NEXT:    sw zero, 0(a0)
202 ; CHECK-NEXT:    sw zero, 4(a0)
203 ; CHECK-NEXT:    ret
204   store i32 zeroinitializer, ptr %p
205   %gep = getelementptr i8, ptr %p, i64 4
206   store i32 zeroinitializer, ptr %gep
207   ret void
210 define void @combine_zero_stores_2xi64(ptr %p) {
211 ; RV32-LABEL: combine_zero_stores_2xi64:
212 ; RV32:       # %bb.0:
213 ; RV32-NEXT:    sw zero, 4(a0)
214 ; RV32-NEXT:    sw zero, 0(a0)
215 ; RV32-NEXT:    sw zero, 12(a0)
216 ; RV32-NEXT:    sw zero, 8(a0)
217 ; RV32-NEXT:    ret
219 ; RV64-LABEL: combine_zero_stores_2xi64:
220 ; RV64:       # %bb.0:
221 ; RV64-NEXT:    sd zero, 0(a0)
222 ; RV64-NEXT:    sd zero, 8(a0)
223 ; RV64-NEXT:    ret
224   store i64 zeroinitializer, ptr %p
225   %gep = getelementptr i8, ptr %p, i64 8
226   store i64 zeroinitializer, ptr %gep
227   ret void
230 define void @combine_fp_zero_stores_crash(ptr %ptr)  {
231 ; CHECK-LABEL: combine_fp_zero_stores_crash:
232 ; CHECK:       # %bb.0:
233 ; CHECK-NEXT:    sw zero, 4(a0)
234 ; CHECK-NEXT:    sw zero, 8(a0)
235 ; CHECK-NEXT:    ret
236   %addr1 = getelementptr float, ptr %ptr, i64 1
237   %addr2 = getelementptr float, ptr %ptr, i64 2
238   store float 0.000000e+00, ptr %addr1, align 4
239   store float 0.000000e+00, ptr %addr2, align 4
240   ret void
243 define void @combine_allones_stores_2xi8(ptr %p) {
244 ; CHECK-LABEL: combine_allones_stores_2xi8:
245 ; CHECK:       # %bb.0:
246 ; CHECK-NEXT:    li a1, -1
247 ; CHECK-NEXT:    sh a1, 0(a0)
248 ; CHECK-NEXT:    ret
249   store i8 -1, ptr %p, align 4
250   %gep = getelementptr i8, ptr %p, i64 1
251   store i8 -1, ptr %gep
252   ret void
255 define void @combine_allones_stores_2xi16(ptr %p) {
256 ; CHECK-LABEL: combine_allones_stores_2xi16:
257 ; CHECK:       # %bb.0:
258 ; CHECK-NEXT:    li a1, -1
259 ; CHECK-NEXT:    sw a1, 0(a0)
260 ; CHECK-NEXT:    ret
261   store i16 -1, ptr %p, align 4
262   %gep = getelementptr i8, ptr %p, i64 2
263   store i16 -1, ptr %gep
264   ret void
267 define void @combine_allones_stores_2xi32(ptr %p) {
268 ; RV32-LABEL: combine_allones_stores_2xi32:
269 ; RV32:       # %bb.0:
270 ; RV32-NEXT:    li a1, -1
271 ; RV32-NEXT:    sw a1, 0(a0)
272 ; RV32-NEXT:    sw a1, 4(a0)
273 ; RV32-NEXT:    ret
275 ; RV64-LABEL: combine_allones_stores_2xi32:
276 ; RV64:       # %bb.0:
277 ; RV64-NEXT:    li a1, -1
278 ; RV64-NEXT:    sd a1, 0(a0)
279 ; RV64-NEXT:    ret
280   store i32 -1, ptr %p, align 8
281   %gep = getelementptr i8, ptr %p, i64 4
282   store i32 -1, ptr %gep
283   ret void
286 define void @combine_allones_stores_2xi32_unaligned(ptr %p) {
287 ; CHECK-LABEL: combine_allones_stores_2xi32_unaligned:
288 ; CHECK:       # %bb.0:
289 ; CHECK-NEXT:    li a1, -1
290 ; CHECK-NEXT:    sw a1, 0(a0)
291 ; CHECK-NEXT:    sw a1, 4(a0)
292 ; CHECK-NEXT:    ret
293   store i32 -1, ptr %p
294   %gep = getelementptr i8, ptr %p, i64 4
295   store i32 -1, ptr %gep
296   ret void
299 define void @combine_allones_stores_2xi64(ptr %p) {
300 ; RV32-LABEL: combine_allones_stores_2xi64:
301 ; RV32:       # %bb.0:
302 ; RV32-NEXT:    li a1, -1
303 ; RV32-NEXT:    sw a1, 4(a0)
304 ; RV32-NEXT:    sw a1, 0(a0)
305 ; RV32-NEXT:    sw a1, 12(a0)
306 ; RV32-NEXT:    sw a1, 8(a0)
307 ; RV32-NEXT:    ret
309 ; RV64-LABEL: combine_allones_stores_2xi64:
310 ; RV64:       # %bb.0:
311 ; RV64-NEXT:    li a1, -1
312 ; RV64-NEXT:    sd a1, 0(a0)
313 ; RV64-NEXT:    sd a1, 8(a0)
314 ; RV64-NEXT:    ret
315   store i64 -1, ptr %p
316   %gep = getelementptr i8, ptr %p, i64 8
317   store i64 -1, ptr %gep
318   ret void