[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-ld-from-st.ll
blob44e7bdc37f449a58a0b80c4ab83e097190511d45
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc < %s -mtriple aarch64 -verify-machineinstrs | FileCheck %s
4 define i64 @Str64Ldr64(ptr nocapture %P, i64 %v, i64 %n) {
5 ; CHECK-LABEL: Str64Ldr64:
6 ; CHECK:       // %bb.0: // %entry
7 ; CHECK-NEXT:    mov x8, x0
8 ; CHECK-NEXT:    mov x0, x1
9 ; CHECK-NEXT:    str x1, [x8, #8]
10 ; CHECK-NEXT:    ret
11 entry:
12   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
13   store i64 %v, ptr %arrayidx0
14   %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 1
15   %0 = load i64, ptr %arrayidx1
16   ret i64 %0
19 define i32 @Str64Ldr32_0(ptr nocapture %P, i64 %v, i64 %n) {
20 ; CHECK-LABEL: Str64Ldr32_0:
21 ; CHECK:       // %bb.0: // %entry
22 ; CHECK-NEXT:    mov x8, x0
23 ; CHECK-NEXT:    mov w0, w1
24 ; CHECK-NEXT:    str x1, [x8, #8]
25 ; CHECK-NEXT:    ret
26 entry:
27   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
28   store i64 %v, ptr %arrayidx0
29   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 2
30   %0 = load i32, ptr %arrayidx1
31   ret i32 %0
34 define i32 @Str64Ldr32_1(ptr nocapture %P, i64 %v, i64 %n) {
35 ; CHECK-LABEL: Str64Ldr32_1:
36 ; CHECK:       // %bb.0: // %entry
37 ; CHECK-NEXT:    str x1, [x0, #8]
38 ; CHECK-NEXT:    lsr x0, x1, #32
39 ; CHECK-NEXT:    ret
40 entry:
41   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
42   store i64 %v, ptr %arrayidx0
43   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 3
44   %0 = load i32, ptr %arrayidx1
45   ret i32 %0
48 define i16 @Str64Ldr16_0(ptr nocapture %P, i64 %v, i64 %n) {
49 ; CHECK-LABEL: Str64Ldr16_0:
50 ; CHECK:       // %bb.0: // %entry
51 ; CHECK-NEXT:    mov x8, x0
52 ; CHECK-NEXT:    mov w0, w1
53 ; CHECK-NEXT:    str x1, [x8, #8]
54 ; CHECK-NEXT:    ret
55 entry:
56   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
57   store i64 %v, ptr %arrayidx0
58   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 4
59   %0 = load i16, ptr %arrayidx1
60   ret i16 %0
63 define i16 @Str64Ldr16_1(ptr nocapture %P, i64 %v, i64 %n) {
64 ; CHECK-LABEL: Str64Ldr16_1:
65 ; CHECK:       // %bb.0: // %entry
66 ; CHECK-NEXT:    str x1, [x0, #8]
67 ; CHECK-NEXT:    ubfx x0, x1, #16, #16
68 ; CHECK-NEXT:    ret
69 entry:
70   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
71   store i64 %v, ptr %arrayidx0
72   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 5
73   %0 = load i16, ptr %arrayidx1
74   ret i16 %0
77 define i16 @Str64Ldr16_2(ptr nocapture %P, i64 %v, i64 %n) {
78 ; CHECK-LABEL: Str64Ldr16_2:
79 ; CHECK:       // %bb.0: // %entry
80 ; CHECK-NEXT:    str x1, [x0, #8]
81 ; CHECK-NEXT:    ubfx x0, x1, #32, #16
82 ; CHECK-NEXT:    ret
83 entry:
84   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
85   store i64 %v, ptr %arrayidx0
86   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 6
87   %0 = load i16, ptr %arrayidx1
88   ret i16 %0
91 define i16 @Str64Ldr16_3(ptr nocapture %P, i64 %v, i64 %n) {
92 ; CHECK-LABEL: Str64Ldr16_3:
93 ; CHECK:       // %bb.0: // %entry
94 ; CHECK-NEXT:    str x1, [x0, #8]
95 ; CHECK-NEXT:    lsr x0, x1, #48
96 ; CHECK-NEXT:    ret
97 entry:
98   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
99   store i64 %v, ptr %arrayidx0
100   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 7
101   %0 = load i16, ptr %arrayidx1
102   ret i16 %0
105 define i8 @Str64Ldr8_0(ptr nocapture %P, i64 %v, i64 %n) {
106 ; CHECK-LABEL: Str64Ldr8_0:
107 ; CHECK:       // %bb.0: // %entry
108 ; CHECK-NEXT:    mov x8, x0
109 ; CHECK-NEXT:    mov w0, w1
110 ; CHECK-NEXT:    str x1, [x8, #8]
111 ; CHECK-NEXT:    ret
112 entry:
113   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
114   store i64 %v, ptr %arrayidx0
115   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 8
116   %0 = load i8, ptr %arrayidx1
117   ret i8 %0
120 define i8 @Str64Ldr8_1(ptr nocapture %P, i64 %v, i64 %n) {
121 ; CHECK-LABEL: Str64Ldr8_1:
122 ; CHECK:       // %bb.0: // %entry
123 ; CHECK-NEXT:    str x1, [x0, #8]
124 ; CHECK-NEXT:    ubfx x0, x1, #8, #8
125 ; CHECK-NEXT:    ret
126 entry:
127   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
128   store i64 %v, ptr %arrayidx0
129   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 9
130   %0 = load i8, ptr %arrayidx1
131   ret i8 %0
134 define i8 @Str64Ldr8_2(ptr nocapture %P, i64 %v, i64 %n) {
135 ; CHECK-LABEL: Str64Ldr8_2:
136 ; CHECK:       // %bb.0: // %entry
137 ; CHECK-NEXT:    str x1, [x0, #8]
138 ; CHECK-NEXT:    ubfx x0, x1, #16, #8
139 ; CHECK-NEXT:    ret
140 entry:
141   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
142   store i64 %v, ptr %arrayidx0
143   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 10
144   %0 = load i8, ptr %arrayidx1
145   ret i8 %0
148 define i8 @Str64Ldr8_3(ptr nocapture %P, i64 %v, i64 %n) {
149 ; CHECK-LABEL: Str64Ldr8_3:
150 ; CHECK:       // %bb.0: // %entry
151 ; CHECK-NEXT:    str x1, [x0, #8]
152 ; CHECK-NEXT:    ubfx x0, x1, #24, #8
153 ; CHECK-NEXT:    ret
154 entry:
155   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
156   store i64 %v, ptr %arrayidx0
157   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 11
158   %0 = load i8, ptr %arrayidx1
159   ret i8 %0
162 define i8 @Str64Ldr8_4(ptr nocapture %P, i64 %v, i64 %n) {
163 ; CHECK-LABEL: Str64Ldr8_4:
164 ; CHECK:       // %bb.0: // %entry
165 ; CHECK-NEXT:    str x1, [x0, #8]
166 ; CHECK-NEXT:    ubfx x0, x1, #32, #8
167 ; CHECK-NEXT:    ret
168 entry:
169   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
170   store i64 %v, ptr %arrayidx0
171   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 12
172   %0 = load i8, ptr %arrayidx1
173   ret i8 %0
176 define i8 @Str64Ldr8_5(ptr nocapture %P, i64 %v, i64 %n) {
177 ; CHECK-LABEL: Str64Ldr8_5:
178 ; CHECK:       // %bb.0: // %entry
179 ; CHECK-NEXT:    str x1, [x0, #8]
180 ; CHECK-NEXT:    ubfx x0, x1, #40, #8
181 ; CHECK-NEXT:    ret
182 entry:
183   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
184   store i64 %v, ptr %arrayidx0
185   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 13
186   %0 = load i8, ptr %arrayidx1
187   ret i8 %0
190 define i8 @Str64Ldr8_6(ptr nocapture %P, i64 %v, i64 %n) {
191 ; CHECK-LABEL: Str64Ldr8_6:
192 ; CHECK:       // %bb.0: // %entry
193 ; CHECK-NEXT:    str x1, [x0, #8]
194 ; CHECK-NEXT:    ubfx x0, x1, #48, #8
195 ; CHECK-NEXT:    ret
196 entry:
197   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
198   store i64 %v, ptr %arrayidx0
199   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 14
200   %0 = load i8, ptr %arrayidx1
201   ret i8 %0
204 define i8 @Str64Ldr8_7(ptr nocapture %P, i64 %v, i64 %n) {
205 ; CHECK-LABEL: Str64Ldr8_7:
206 ; CHECK:       // %bb.0: // %entry
207 ; CHECK-NEXT:    str x1, [x0, #8]
208 ; CHECK-NEXT:    lsr x0, x1, #56
209 ; CHECK-NEXT:    ret
210 entry:
211   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1
212   store i64 %v, ptr %arrayidx0
213   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 15
214   %0 = load i8, ptr %arrayidx1
215   ret i8 %0
218 define i32 @Str32Ldr32(ptr nocapture %P, i32 %v, i64 %n) {
219 ; CHECK-LABEL: Str32Ldr32:
220 ; CHECK:       // %bb.0: // %entry
221 ; CHECK-NEXT:    mov x8, x0
222 ; CHECK-NEXT:    mov w0, w1
223 ; CHECK-NEXT:    str w1, [x8, #4]
224 ; CHECK-NEXT:    ret
225 entry:
226   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
227   store i32 %v, ptr %arrayidx0
228   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 1
229   %0 = load i32, ptr %arrayidx1
230   ret i32 %0
233 define i16 @Str32Ldr16_0(ptr nocapture %P, i32 %v, i64 %n) {
234 ; CHECK-LABEL: Str32Ldr16_0:
235 ; CHECK:       // %bb.0: // %entry
236 ; CHECK-NEXT:    mov x8, x0
237 ; CHECK-NEXT:    mov w0, w1
238 ; CHECK-NEXT:    str w1, [x8, #4]
239 ; CHECK-NEXT:    ret
240 entry:
241   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
242   store i32 %v, ptr %arrayidx0
243   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2
244   %0 = load i16, ptr %arrayidx1
245   ret i16 %0
248 define i16 @Str32Ldr16_1(ptr nocapture %P, i32 %v, i64 %n) {
249 ; CHECK-LABEL: Str32Ldr16_1:
250 ; CHECK:       // %bb.0: // %entry
251 ; CHECK-NEXT:    str w1, [x0, #4]
252 ; CHECK-NEXT:    lsr w0, w1, #16
253 ; CHECK-NEXT:    ret
254 entry:
255   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
256   store i32 %v, ptr %arrayidx0
257   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 3
258   %0 = load i16, ptr %arrayidx1
259   ret i16 %0
262 define i8 @Str32Ldr8_0(ptr nocapture %P, i32 %v, i64 %n) {
263 ; CHECK-LABEL: Str32Ldr8_0:
264 ; CHECK:       // %bb.0: // %entry
265 ; CHECK-NEXT:    mov x8, x0
266 ; CHECK-NEXT:    mov w0, w1
267 ; CHECK-NEXT:    str w1, [x8, #4]
268 ; CHECK-NEXT:    ret
269 entry:
270   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
271   store i32 %v, ptr %arrayidx0
272   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 4
273   %0 = load i8, ptr %arrayidx1
274   ret i8 %0
277 define i8 @Str32Ldr8_1(ptr nocapture %P, i32 %v, i64 %n) {
278 ; CHECK-LABEL: Str32Ldr8_1:
279 ; CHECK:       // %bb.0: // %entry
280 ; CHECK-NEXT:    str w1, [x0, #4]
281 ; CHECK-NEXT:    ubfx w0, w1, #8, #8
282 ; CHECK-NEXT:    ret
283 entry:
284   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
285   store i32 %v, ptr %arrayidx0
286   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 5
287   %0 = load i8, ptr %arrayidx1
288   ret i8 %0
291 define i8 @Str32Ldr8_2(ptr nocapture %P, i32 %v, i64 %n) {
292 ; CHECK-LABEL: Str32Ldr8_2:
293 ; CHECK:       // %bb.0: // %entry
294 ; CHECK-NEXT:    str w1, [x0, #4]
295 ; CHECK-NEXT:    ubfx w0, w1, #16, #8
296 ; CHECK-NEXT:    ret
297 entry:
298   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
299   store i32 %v, ptr %arrayidx0
300   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 6
301   %0 = load i8, ptr %arrayidx1
302   ret i8 %0
305 define i8 @Str32Ldr8_3(ptr nocapture %P, i32 %v, i64 %n) {
306 ; CHECK-LABEL: Str32Ldr8_3:
307 ; CHECK:       // %bb.0: // %entry
308 ; CHECK-NEXT:    str w1, [x0, #4]
309 ; CHECK-NEXT:    lsr w0, w1, #24
310 ; CHECK-NEXT:    ret
311 entry:
312   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
313   store i32 %v, ptr %arrayidx0
314   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 7
315   %0 = load i8, ptr %arrayidx1
316   ret i8 %0
319 define i16 @Str16Ldr16(ptr nocapture %P, i16 %v, i64 %n) {
320 ; CHECK-LABEL: Str16Ldr16:
321 ; CHECK:       // %bb.0: // %entry
322 ; CHECK-NEXT:    mov x8, x0
323 ; CHECK-NEXT:    mov w0, w1
324 ; CHECK-NEXT:    strh w1, [x8, #2]
325 ; CHECK-NEXT:    ret
326 entry:
327   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1
328   store i16 %v, ptr %arrayidx0
329   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1
330   %0 = load i16, ptr %arrayidx1
331   ret i16 %0
334 define i8 @Str16Ldr8_0(ptr nocapture %P, i16 %v, i64 %n) {
335 ; CHECK-LABEL: Str16Ldr8_0:
336 ; CHECK:       // %bb.0: // %entry
337 ; CHECK-NEXT:    mov x8, x0
338 ; CHECK-NEXT:    mov w0, w1
339 ; CHECK-NEXT:    strh w1, [x8, #2]
340 ; CHECK-NEXT:    ret
341 entry:
342   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1
343   store i16 %v, ptr %arrayidx0
344   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 2
345   %0 = load i8, ptr %arrayidx1
346   ret i8 %0
349 define i8 @Str16Ldr8_1(ptr nocapture %P, i16 %v, i64 %n) {
350 ; CHECK-LABEL: Str16Ldr8_1:
351 ; CHECK:       // %bb.0: // %entry
352 ; CHECK-NEXT:    strh w1, [x0, #2]
353 ; CHECK-NEXT:    ubfx w0, w1, #8, #8
354 ; CHECK-NEXT:    ret
355 entry:
356   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1
357   store i16 %v, ptr %arrayidx0
358   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 3
359   %0 = load i8, ptr %arrayidx1
360   ret i8 %0
364 define i64 @Unscaled_Str64Ldr64(ptr nocapture %P, i64 %v, i64 %n) {
365 ; CHECK-LABEL: Unscaled_Str64Ldr64:
366 ; CHECK:       // %bb.0: // %entry
367 ; CHECK-NEXT:    mov x8, x0
368 ; CHECK-NEXT:    mov x0, x1
369 ; CHECK-NEXT:    stur x1, [x8, #-8]
370 ; CHECK-NEXT:    ret
371 entry:
372   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
373   store i64 %v, ptr %arrayidx0
374   %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 -1
375   %0 = load i64, ptr %arrayidx1
376   ret i64 %0
379 define i32 @Unscaled_Str64Ldr32_0(ptr nocapture %P, i64 %v, i64 %n) {
380 ; CHECK-LABEL: Unscaled_Str64Ldr32_0:
381 ; CHECK:       // %bb.0: // %entry
382 ; CHECK-NEXT:    mov x8, x0
383 ; CHECK-NEXT:    mov w0, w1
384 ; CHECK-NEXT:    stur x1, [x8, #-8]
385 ; CHECK-NEXT:    ret
386 entry:
387   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
388   store i64 %v, ptr %arrayidx0
389   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -2
390   %0 = load i32, ptr %arrayidx1
391   ret i32 %0
394 define i32 @Unscaled_Str64Ldr32_1(ptr nocapture %P, i64 %v, i64 %n) {
395 ; CHECK-LABEL: Unscaled_Str64Ldr32_1:
396 ; CHECK:       // %bb.0: // %entry
397 ; CHECK-NEXT:    stur x1, [x0, #-8]
398 ; CHECK-NEXT:    lsr x0, x1, #32
399 ; CHECK-NEXT:    ret
400 entry:
401   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
402   store i64 %v, ptr %arrayidx0
403   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -1
404   %0 = load i32, ptr %arrayidx1
405   ret i32 %0
408 define i16 @Unscaled_Str64Ldr16_0(ptr nocapture %P, i64 %v, i64 %n) {
409 ; CHECK-LABEL: Unscaled_Str64Ldr16_0:
410 ; CHECK:       // %bb.0: // %entry
411 ; CHECK-NEXT:    mov x8, x0
412 ; CHECK-NEXT:    mov w0, w1
413 ; CHECK-NEXT:    stur x1, [x8, #-8]
414 ; CHECK-NEXT:    ret
415 entry:
416   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
417   store i64 %v, ptr %arrayidx0
418   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -4
419   %0 = load i16, ptr %arrayidx1
420   ret i16 %0
423 define i16 @Unscaled_Str64Ldr16_1(ptr nocapture %P, i64 %v, i64 %n) {
424 ; CHECK-LABEL: Unscaled_Str64Ldr16_1:
425 ; CHECK:       // %bb.0: // %entry
426 ; CHECK-NEXT:    stur x1, [x0, #-8]
427 ; CHECK-NEXT:    ubfx x0, x1, #16, #16
428 ; CHECK-NEXT:    ret
429 entry:
430   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
431   store i64 %v, ptr %arrayidx0
432   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -3
433   %0 = load i16, ptr %arrayidx1
434   ret i16 %0
437 define i16 @Unscaled_Str64Ldr16_2(ptr nocapture %P, i64 %v, i64 %n) {
438 ; CHECK-LABEL: Unscaled_Str64Ldr16_2:
439 ; CHECK:       // %bb.0: // %entry
440 ; CHECK-NEXT:    stur x1, [x0, #-8]
441 ; CHECK-NEXT:    ubfx x0, x1, #32, #16
442 ; CHECK-NEXT:    ret
443 entry:
444   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
445   store i64 %v, ptr %arrayidx0
446   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -2
447   %0 = load i16, ptr %arrayidx1
448   ret i16 %0
451 define i16 @Unscaled_Str64Ldr16_3(ptr nocapture %P, i64 %v, i64 %n) {
452 ; CHECK-LABEL: Unscaled_Str64Ldr16_3:
453 ; CHECK:       // %bb.0: // %entry
454 ; CHECK-NEXT:    stur x1, [x0, #-8]
455 ; CHECK-NEXT:    lsr x0, x1, #48
456 ; CHECK-NEXT:    ret
457 entry:
458   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
459   store i64 %v, ptr %arrayidx0
460   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1
461   %0 = load i16, ptr %arrayidx1
462   ret i16 %0
465 define i8 @Unscaled_Str64Ldr8_0(ptr nocapture %P, i64 %v, i64 %n) {
466 ; CHECK-LABEL: Unscaled_Str64Ldr8_0:
467 ; CHECK:       // %bb.0: // %entry
468 ; CHECK-NEXT:    mov x8, x0
469 ; CHECK-NEXT:    mov w0, w1
470 ; CHECK-NEXT:    stur x1, [x8, #-8]
471 ; CHECK-NEXT:    ret
472 entry:
473   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
474   store i64 %v, ptr %arrayidx0
475   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -8
476   %0 = load i8, ptr %arrayidx1
477   ret i8 %0
480 define i8 @Unscaled_Str64Ldr8_1(ptr nocapture %P, i64 %v, i64 %n) {
481 ; CHECK-LABEL: Unscaled_Str64Ldr8_1:
482 ; CHECK:       // %bb.0: // %entry
483 ; CHECK-NEXT:    stur x1, [x0, #-8]
484 ; CHECK-NEXT:    ubfx x0, x1, #8, #8
485 ; CHECK-NEXT:    ret
486 entry:
487   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
488   store i64 %v, ptr %arrayidx0
489   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -7
490   %0 = load i8, ptr %arrayidx1
491   ret i8 %0
494 define i8 @Unscaled_Str64Ldr8_2(ptr nocapture %P, i64 %v, i64 %n) {
495 ; CHECK-LABEL: Unscaled_Str64Ldr8_2:
496 ; CHECK:       // %bb.0: // %entry
497 ; CHECK-NEXT:    stur x1, [x0, #-8]
498 ; CHECK-NEXT:    ubfx x0, x1, #16, #8
499 ; CHECK-NEXT:    ret
500 entry:
501   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
502   store i64 %v, ptr %arrayidx0
503   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -6
504   %0 = load i8, ptr %arrayidx1
505   ret i8 %0
508 define i8 @Unscaled_Str64Ldr8_3(ptr nocapture %P, i64 %v, i64 %n) {
509 ; CHECK-LABEL: Unscaled_Str64Ldr8_3:
510 ; CHECK:       // %bb.0: // %entry
511 ; CHECK-NEXT:    stur x1, [x0, #-8]
512 ; CHECK-NEXT:    ubfx x0, x1, #24, #8
513 ; CHECK-NEXT:    ret
514 entry:
515   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
516   store i64 %v, ptr %arrayidx0
517   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -5
518   %0 = load i8, ptr %arrayidx1
519   ret i8 %0
522 define i8 @Unscaled_Str64Ldr8_4(ptr nocapture %P, i64 %v, i64 %n) {
523 ; CHECK-LABEL: Unscaled_Str64Ldr8_4:
524 ; CHECK:       // %bb.0: // %entry
525 ; CHECK-NEXT:    stur x1, [x0, #-8]
526 ; CHECK-NEXT:    ubfx x0, x1, #32, #8
527 ; CHECK-NEXT:    ret
528 entry:
529   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
530   store i64 %v, ptr %arrayidx0
531   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -4
532   %0 = load i8, ptr %arrayidx1
533   ret i8 %0
536 define i8 @Unscaled_Str64Ldr8_5(ptr nocapture %P, i64 %v, i64 %n) {
537 ; CHECK-LABEL: Unscaled_Str64Ldr8_5:
538 ; CHECK:       // %bb.0: // %entry
539 ; CHECK-NEXT:    stur x1, [x0, #-8]
540 ; CHECK-NEXT:    ubfx x0, x1, #40, #8
541 ; CHECK-NEXT:    ret
542 entry:
543   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
544   store i64 %v, ptr %arrayidx0
545   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -3
546   %0 = load i8, ptr %arrayidx1
547   ret i8 %0
550 define i8 @Unscaled_Str64Ldr8_6(ptr nocapture %P, i64 %v, i64 %n) {
551 ; CHECK-LABEL: Unscaled_Str64Ldr8_6:
552 ; CHECK:       // %bb.0: // %entry
553 ; CHECK-NEXT:    stur x1, [x0, #-8]
554 ; CHECK-NEXT:    ubfx x0, x1, #48, #8
555 ; CHECK-NEXT:    ret
556 entry:
557   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
558   store i64 %v, ptr %arrayidx0
559   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2
560   %0 = load i8, ptr %arrayidx1
561   ret i8 %0
564 define i8 @Unscaled_Str64Ldr8_7(ptr nocapture %P, i64 %v, i64 %n) {
565 ; CHECK-LABEL: Unscaled_Str64Ldr8_7:
566 ; CHECK:       // %bb.0: // %entry
567 ; CHECK-NEXT:    stur x1, [x0, #-8]
568 ; CHECK-NEXT:    lsr x0, x1, #56
569 ; CHECK-NEXT:    ret
570 entry:
571   %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1
572   store i64 %v, ptr %arrayidx0
573   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1
574   %0 = load i8, ptr %arrayidx1
575   ret i8 %0
578 define i32 @Unscaled_Str32Ldr32(ptr nocapture %P, i32 %v, i64 %n) {
579 ; CHECK-LABEL: Unscaled_Str32Ldr32:
580 ; CHECK:       // %bb.0: // %entry
581 ; CHECK-NEXT:    mov x8, x0
582 ; CHECK-NEXT:    mov w0, w1
583 ; CHECK-NEXT:    stur w1, [x8, #-4]
584 ; CHECK-NEXT:    ret
585 entry:
586   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
587   store i32 %v, ptr %arrayidx0
588   %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -1
589   %0 = load i32, ptr %arrayidx1
590   ret i32 %0
593 define i16 @Unscaled_Str32Ldr16_0(ptr nocapture %P, i32 %v, i64 %n) {
594 ; CHECK-LABEL: Unscaled_Str32Ldr16_0:
595 ; CHECK:       // %bb.0: // %entry
596 ; CHECK-NEXT:    mov x8, x0
597 ; CHECK-NEXT:    mov w0, w1
598 ; CHECK-NEXT:    stur w1, [x8, #-4]
599 ; CHECK-NEXT:    ret
600 entry:
601   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
602   store i32 %v, ptr %arrayidx0
603   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -2
604   %0 = load i16, ptr %arrayidx1
605   ret i16 %0
608 define i16 @Unscaled_Str32Ldr16_1(ptr nocapture %P, i32 %v, i64 %n) {
609 ; CHECK-LABEL: Unscaled_Str32Ldr16_1:
610 ; CHECK:       // %bb.0: // %entry
611 ; CHECK-NEXT:    stur w1, [x0, #-4]
612 ; CHECK-NEXT:    lsr w0, w1, #16
613 ; CHECK-NEXT:    ret
614 entry:
615   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
616   store i32 %v, ptr %arrayidx0
617   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1
618   %0 = load i16, ptr %arrayidx1
619   ret i16 %0
622 define i8 @Unscaled_Str32Ldr8_0(ptr nocapture %P, i32 %v, i64 %n) {
623 ; CHECK-LABEL: Unscaled_Str32Ldr8_0:
624 ; CHECK:       // %bb.0: // %entry
625 ; CHECK-NEXT:    mov x8, x0
626 ; CHECK-NEXT:    mov w0, w1
627 ; CHECK-NEXT:    stur w1, [x8, #-4]
628 ; CHECK-NEXT:    ret
629 entry:
630   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
631   store i32 %v, ptr %arrayidx0
632   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -4
633   %0 = load i8, ptr %arrayidx1
634   ret i8 %0
637 define i8 @Unscaled_Str32Ldr8_1(ptr nocapture %P, i32 %v, i64 %n) {
638 ; CHECK-LABEL: Unscaled_Str32Ldr8_1:
639 ; CHECK:       // %bb.0: // %entry
640 ; CHECK-NEXT:    stur w1, [x0, #-4]
641 ; CHECK-NEXT:    ubfx w0, w1, #8, #8
642 ; CHECK-NEXT:    ret
643 entry:
644   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
645   store i32 %v, ptr %arrayidx0
646   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -3
647   %0 = load i8, ptr %arrayidx1
648   ret i8 %0
651 define i8 @Unscaled_Str32Ldr8_2(ptr nocapture %P, i32 %v, i64 %n) {
652 ; CHECK-LABEL: Unscaled_Str32Ldr8_2:
653 ; CHECK:       // %bb.0: // %entry
654 ; CHECK-NEXT:    stur w1, [x0, #-4]
655 ; CHECK-NEXT:    ubfx w0, w1, #16, #8
656 ; CHECK-NEXT:    ret
657 entry:
658   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
659   store i32 %v, ptr %arrayidx0
660   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2
661   %0 = load i8, ptr %arrayidx1
662   ret i8 %0
665 define i8 @Unscaled_Str32Ldr8_3(ptr nocapture %P, i32 %v, i64 %n) {
666 ; CHECK-LABEL: Unscaled_Str32Ldr8_3:
667 ; CHECK:       // %bb.0: // %entry
668 ; CHECK-NEXT:    stur w1, [x0, #-4]
669 ; CHECK-NEXT:    lsr w0, w1, #24
670 ; CHECK-NEXT:    ret
671 entry:
672   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
673   store i32 %v, ptr %arrayidx0
674   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1
675   %0 = load i8, ptr %arrayidx1
676   ret i8 %0
679 define i16 @Unscaled_Str16Ldr16(ptr nocapture %P, i16 %v, i64 %n) {
680 ; CHECK-LABEL: Unscaled_Str16Ldr16:
681 ; CHECK:       // %bb.0: // %entry
682 ; CHECK-NEXT:    mov x8, x0
683 ; CHECK-NEXT:    mov w0, w1
684 ; CHECK-NEXT:    sturh w1, [x8, #-2]
685 ; CHECK-NEXT:    ret
686 entry:
687   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1
688   store i16 %v, ptr %arrayidx0
689   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1
690   %0 = load i16, ptr %arrayidx1
691   ret i16 %0
694 define i8 @Unscaled_Str16Ldr8_0(ptr nocapture %P, i16 %v, i64 %n) {
695 ; CHECK-LABEL: Unscaled_Str16Ldr8_0:
696 ; CHECK:       // %bb.0: // %entry
697 ; CHECK-NEXT:    mov x8, x0
698 ; CHECK-NEXT:    mov w0, w1
699 ; CHECK-NEXT:    sturh w1, [x8, #-2]
700 ; CHECK-NEXT:    ret
701 entry:
702   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1
703   store i16 %v, ptr %arrayidx0
704   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2
705   %0 = load i8, ptr %arrayidx1
706   ret i8 %0
709 define i8 @Unscaled_Str16Ldr8_1(ptr nocapture %P, i16 %v, i64 %n) {
710 ; CHECK-LABEL: Unscaled_Str16Ldr8_1:
711 ; CHECK:       // %bb.0: // %entry
712 ; CHECK-NEXT:    sturh w1, [x0, #-2]
713 ; CHECK-NEXT:    ubfx w0, w1, #8, #8
714 ; CHECK-NEXT:    ret
715 entry:
716   %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1
717   store i16 %v, ptr %arrayidx0
718   %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1
719   %0 = load i8, ptr %arrayidx1
720   ret i8 %0
723 define i16 @StrVolatileLdr(ptr nocapture %P, i32 %v, i64 %n) {
724 ; CHECK-LABEL: StrVolatileLdr:
725 ; CHECK:       // %bb.0: // %entry
726 ; CHECK-NEXT:    str w1, [x0, #4]
727 ; CHECK-NEXT:    ldrh w0, [x0, #4]
728 ; CHECK-NEXT:    ret
729 entry:
730   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
731   store i32 %v, ptr %arrayidx0
732   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2
733   %0 = load volatile i16, ptr %arrayidx1
734   ret i16 %0
737 define i16 @StrNotInRangeLdr(ptr nocapture %P, i32 %v, i64 %n) {
738 ; CHECK-LABEL: StrNotInRangeLdr:
739 ; CHECK:       // %bb.0: // %entry
740 ; CHECK-NEXT:    mov x8, x0
741 ; CHECK-NEXT:    ldrh w0, [x0, #2]
742 ; CHECK-NEXT:    str w1, [x8, #4]
743 ; CHECK-NEXT:    ret
744 entry:
745   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
746   store i32 %v, ptr %arrayidx0
747   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1
748   %0 = load i16, ptr %arrayidx1
749   ret i16 %0
752 define i16 @Unscaled_StrNotInRangeLdr(ptr nocapture %P, i32 %v, i64 %n) {
753 ; CHECK-LABEL: Unscaled_StrNotInRangeLdr:
754 ; CHECK:       // %bb.0: // %entry
755 ; CHECK-NEXT:    mov x8, x0
756 ; CHECK-NEXT:    ldurh w0, [x0, #-6]
757 ; CHECK-NEXT:    stur w1, [x8, #-4]
758 ; CHECK-NEXT:    ret
759 entry:
760   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1
761   store i32 %v, ptr %arrayidx0
762   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -3
763   %0 = load i16, ptr %arrayidx1
764   ret i16 %0
767 define i16 @StrCallLdr(ptr nocapture %P, i32 %v, i64 %n) {
768 ; CHECK-LABEL: StrCallLdr:
769 ; CHECK:       // %bb.0: // %entry
770 ; CHECK-NEXT:    stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
771 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
772 ; CHECK-NEXT:    .cfi_offset w19, -8
773 ; CHECK-NEXT:    .cfi_offset w30, -16
774 ; CHECK-NEXT:    mov x19, x0
775 ; CHECK-NEXT:    str w1, [x0, #4]
776 ; CHECK-NEXT:    bl test_dummy
777 ; CHECK-NEXT:    ldrh w0, [x19, #2]
778 ; CHECK-NEXT:    ldp x30, x19, [sp], #16 // 16-byte Folded Reload
779 ; CHECK-NEXT:    ret
780 entry:
781   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
782   store i32 %v, ptr %arrayidx0
783   %c = call i1 @test_dummy()
784   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1
785   %0 = load i16, ptr %arrayidx1
786   ret i16 %0
789 declare i1 @test_dummy()
791 define i16 @StrStrLdr(i32 %v, ptr %P, ptr %P2, i32 %n) {
792 ; CHECK-LABEL: StrStrLdr:
793 ; CHECK:       // %bb.0: // %entry
794 ; CHECK-NEXT:    str w0, [x1, #4]
795 ; CHECK-NEXT:    str w3, [x2]
796 ; CHECK-NEXT:    ldrh w0, [x1, #4]
797 ; CHECK-NEXT:    ret
798 entry:
799   %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1
800   store i32 %v, ptr %arrayidx0
801   store i32 %n, ptr %P2
802   %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2
803   %0 = load i16, ptr %arrayidx1
804   ret i16 %0