xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/combine-store.ll (revision 2967e5f8007d873a3e9d97870d2461d0827a3976)
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
4
5define 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
14}
15
16define 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
29}
30
31define 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
37;
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
58}
59
60define 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
69}
70
71define 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
77;
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
90}
91
92define 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
102;
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
124}
125
126define 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
132;
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
141}
142
143define 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
150;
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
164}
165
166define 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
173;
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
196}
197
198define 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
208}
209
210define void @combine_zero_stores_2xi64(ptr %p) {
211; RV32-LABEL: combine_zero_stores_2xi64:
212; RV32:       # %bb.0:
213; RV32-NEXT:    sw zero, 0(a0)
214; RV32-NEXT:    sw zero, 4(a0)
215; RV32-NEXT:    sw zero, 8(a0)
216; RV32-NEXT:    sw zero, 12(a0)
217; RV32-NEXT:    ret
218;
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
228}
229
230define 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
241}
242
243define 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
253}
254
255define 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
265}
266
267define 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
274;
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
284}
285
286define 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
297}
298
299define 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, 0(a0)
304; RV32-NEXT:    sw a1, 4(a0)
305; RV32-NEXT:    sw a1, 8(a0)
306; RV32-NEXT:    sw a1, 12(a0)
307; RV32-NEXT:    ret
308;
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
319}
320