xref: /llvm-project/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll (revision c9e8b73694131d2d9cc9224734122ec658937dd4)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK64
3; RUN: llc < %s -mtriple=arm64-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone -global-isel -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,GISEL
4; RUN: llc < %s -mtriple=arm64_32-apple-ios -aarch64-enable-sink-fold=true -aarch64-redzone | FileCheck %s --check-prefixes=CHECK,CHECK32
5
6define ptr @store64(ptr %ptr, i64 %index, i64 %spacing) {
7; CHECK-LABEL: store64:
8; CHECK:       ; %bb.0:
9; CHECK-NEXT:    str x2, [x0], #8
10; CHECK-NEXT:    ret
11  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 1
12  store i64 %spacing, ptr %ptr, align 4
13  ret ptr %incdec.ptr
14}
15
16define ptr @store64idxpos256(ptr %ptr, i64 %index, i64 %spacing) {
17; CHECK-LABEL: store64idxpos256:
18; CHECK:       ; %bb.0:
19; CHECK-NEXT:    mov x8, x0
20; CHECK-NEXT:    add x0, x0, #256
21; CHECK-NEXT:    str x2, [x8]
22; CHECK-NEXT:    ret
23  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32
24  store i64 %spacing, ptr %ptr, align 4
25  ret ptr %incdec.ptr
26}
27
28define ptr @store64idxneg256(ptr %ptr, i64 %index, i64 %spacing) {
29; CHECK-LABEL: store64idxneg256:
30; CHECK:       ; %bb.0:
31; CHECK-NEXT:    str x2, [x0], #-256
32; CHECK-NEXT:    ret
33  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32
34  store i64 %spacing, ptr %ptr, align 4
35  ret ptr %incdec.ptr
36}
37
38define ptr @store32(ptr %ptr, i32 %index, i32 %spacing) {
39; CHECK-LABEL: store32:
40; CHECK:       ; %bb.0:
41; CHECK-NEXT:    str w2, [x0], #4
42; CHECK-NEXT:    ret
43  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1
44  store i32 %spacing, ptr %ptr, align 4
45  ret ptr %incdec.ptr
46}
47
48define ptr @store32idxpos256(ptr %ptr, i32 %index, i32 %spacing) {
49; CHECK-LABEL: store32idxpos256:
50; CHECK:       ; %bb.0:
51; CHECK-NEXT:    mov x8, x0
52; CHECK-NEXT:    add x0, x0, #256
53; CHECK-NEXT:    str w2, [x8]
54; CHECK-NEXT:    ret
55  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64
56  store i32 %spacing, ptr %ptr, align 4
57  ret ptr %incdec.ptr
58}
59
60define ptr @store32idxneg256(ptr %ptr, i32 %index, i32 %spacing) {
61; CHECK-LABEL: store32idxneg256:
62; CHECK:       ; %bb.0:
63; CHECK-NEXT:    str w2, [x0], #-256
64; CHECK-NEXT:    ret
65  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64
66  store i32 %spacing, ptr %ptr, align 4
67  ret ptr %incdec.ptr
68}
69
70define ptr @store16(ptr %ptr, i16 %index, i16 %spacing) {
71; CHECK-LABEL: store16:
72; CHECK:       ; %bb.0:
73; CHECK-NEXT:    strh w2, [x0], #2
74; CHECK-NEXT:    ret
75  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1
76  store i16 %spacing, ptr %ptr, align 4
77  ret ptr %incdec.ptr
78}
79
80define ptr @store16idxpos256(ptr %ptr, i16 %index, i16 %spacing) {
81; CHECK-LABEL: store16idxpos256:
82; CHECK:       ; %bb.0:
83; CHECK-NEXT:    mov x8, x0
84; CHECK-NEXT:    add x0, x0, #256
85; CHECK-NEXT:    strh w2, [x8]
86; CHECK-NEXT:    ret
87  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128
88  store i16 %spacing, ptr %ptr, align 4
89  ret ptr %incdec.ptr
90}
91
92define ptr @store16idxneg256(ptr %ptr, i16 %index, i16 %spacing) {
93; CHECK-LABEL: store16idxneg256:
94; CHECK:       ; %bb.0:
95; CHECK-NEXT:    strh w2, [x0], #-256
96; CHECK-NEXT:    ret
97  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128
98  store i16 %spacing, ptr %ptr, align 4
99  ret ptr %incdec.ptr
100}
101
102define ptr @store8(ptr %ptr, i8 %index, i8 %spacing) {
103; CHECK-LABEL: store8:
104; CHECK:       ; %bb.0:
105; CHECK-NEXT:    strb w2, [x0], #1
106; CHECK-NEXT:    ret
107  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1
108  store i8 %spacing, ptr %ptr, align 4
109  ret ptr %incdec.ptr
110}
111
112define ptr @store8idxpos256(ptr %ptr, i8 %index, i8 %spacing) {
113; CHECK-LABEL: store8idxpos256:
114; CHECK:       ; %bb.0:
115; CHECK-NEXT:    mov x8, x0
116; CHECK-NEXT:    add x0, x0, #256
117; CHECK-NEXT:    strb w2, [x8]
118; CHECK-NEXT:    ret
119  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256
120  store i8 %spacing, ptr %ptr, align 4
121  ret ptr %incdec.ptr
122}
123
124define ptr @store8idxneg256(ptr %ptr, i8 %index, i8 %spacing) {
125; CHECK-LABEL: store8idxneg256:
126; CHECK:       ; %bb.0:
127; CHECK-NEXT:    strb w2, [x0], #-256
128; CHECK-NEXT:    ret
129  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256
130  store i8 %spacing, ptr %ptr, align 4
131  ret ptr %incdec.ptr
132}
133
134define ptr @truncst64to32(ptr %ptr, i32 %index, i64 %spacing) {
135; CHECK-LABEL: truncst64to32:
136; CHECK:       ; %bb.0:
137; CHECK-NEXT:    str w2, [x0], #4
138; CHECK-NEXT:    ret
139  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 1
140  %trunc = trunc i64 %spacing to i32
141  store i32 %trunc, ptr %ptr, align 4
142  ret ptr %incdec.ptr
143}
144
145define ptr @truncst64to16(ptr %ptr, i16 %index, i64 %spacing) {
146; CHECK-LABEL: truncst64to16:
147; CHECK:       ; %bb.0:
148; CHECK-NEXT:    strh w2, [x0], #2
149; CHECK-NEXT:    ret
150  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 1
151  %trunc = trunc i64 %spacing to i16
152  store i16 %trunc, ptr %ptr, align 4
153  ret ptr %incdec.ptr
154}
155
156define ptr @truncst64to8(ptr %ptr, i8 %index, i64 %spacing) {
157; CHECK-LABEL: truncst64to8:
158; CHECK:       ; %bb.0:
159; CHECK-NEXT:    strb w2, [x0], #1
160; CHECK-NEXT:    ret
161  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 1
162  %trunc = trunc i64 %spacing to i8
163  store i8 %trunc, ptr %ptr, align 4
164  ret ptr %incdec.ptr
165}
166
167
168define ptr @storef16(ptr %ptr, half %index, half %spacing) nounwind {
169; CHECK-LABEL: storef16:
170; CHECK:       ; %bb.0:
171; CHECK-NEXT:    str h1, [x0], #2
172; CHECK-NEXT:    ret
173  %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 1
174  store half %spacing, ptr %ptr, align 2
175  ret ptr %incdec.ptr
176}
177
178define ptr @storef32(ptr %ptr, float %index, float %spacing) {
179; CHECK-LABEL: storef32:
180; CHECK:       ; %bb.0:
181; CHECK-NEXT:    str s1, [x0], #4
182; CHECK-NEXT:    ret
183  %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 1
184  store float %spacing, ptr %ptr, align 4
185  ret ptr %incdec.ptr
186}
187
188define ptr @storef64(ptr %ptr, double %index, double %spacing) {
189; CHECK-LABEL: storef64:
190; CHECK:       ; %bb.0:
191; CHECK-NEXT:    str d1, [x0], #8
192; CHECK-NEXT:    ret
193  %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 1
194  store double %spacing, ptr %ptr, align 4
195  ret ptr %incdec.ptr
196}
197
198
199define ptr @pref64(ptr %ptr, double %spacing) {
200; CHECK-LABEL: pref64:
201; CHECK:       ; %bb.0:
202; CHECK-NEXT:    str d0, [x0, #32]!
203; CHECK-NEXT:    ret
204  %incdec.ptr = getelementptr inbounds double, ptr %ptr, i64 4
205  store double %spacing, ptr %incdec.ptr, align 4
206  ret ptr %incdec.ptr
207}
208
209define ptr @pref32(ptr %ptr, float %spacing) {
210; CHECK-LABEL: pref32:
211; CHECK:       ; %bb.0:
212; CHECK-NEXT:    str s0, [x0, #12]!
213; CHECK-NEXT:    ret
214  %incdec.ptr = getelementptr inbounds float, ptr %ptr, i64 3
215  store float %spacing, ptr %incdec.ptr, align 4
216  ret ptr %incdec.ptr
217}
218
219define ptr @pref16(ptr %ptr, half %spacing) nounwind {
220; CHECK-LABEL: pref16:
221; CHECK:       ; %bb.0:
222; CHECK-NEXT:    str h0, [x0, #6]!
223; CHECK-NEXT:    ret
224  %incdec.ptr = getelementptr inbounds half, ptr %ptr, i64 3
225  store half %spacing, ptr %incdec.ptr, align 2
226  ret ptr %incdec.ptr
227}
228
229define ptr @pre64(ptr %ptr, i64 %spacing) {
230; CHECK-LABEL: pre64:
231; CHECK:       ; %bb.0:
232; CHECK-NEXT:    str x1, [x0, #16]!
233; CHECK-NEXT:    ret
234  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 2
235  store i64 %spacing, ptr %incdec.ptr, align 4
236  ret ptr %incdec.ptr
237}
238
239define ptr @pre64idxpos256(ptr %ptr, i64 %spacing) {
240; CHECK-LABEL: pre64idxpos256:
241; CHECK:       ; %bb.0:
242; CHECK-NEXT:    mov x8, x0
243; CHECK-NEXT:    add x0, x0, #256
244; CHECK-NEXT:    str x1, [x8, #256]
245; CHECK-NEXT:    ret
246  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 32
247  store i64 %spacing, ptr %incdec.ptr, align 4
248  ret ptr %incdec.ptr
249}
250
251define ptr @pre64idxneg256(ptr %ptr, i64 %spacing) {
252; CHECK-LABEL: pre64idxneg256:
253; CHECK:       ; %bb.0:
254; CHECK-NEXT:    str x1, [x0, #-256]!
255; CHECK-NEXT:    ret
256  %incdec.ptr = getelementptr inbounds i64, ptr %ptr, i64 -32
257  store i64 %spacing, ptr %incdec.ptr, align 4
258  ret ptr %incdec.ptr
259}
260
261define ptr @pre32(ptr %ptr, i32 %spacing) {
262; CHECK-LABEL: pre32:
263; CHECK:       ; %bb.0:
264; CHECK-NEXT:    str w1, [x0, #8]!
265; CHECK-NEXT:    ret
266  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2
267  store i32 %spacing, ptr %incdec.ptr, align 4
268  ret ptr %incdec.ptr
269}
270
271define ptr @pre32idxpos256(ptr %ptr, i32 %spacing) {
272; CHECK-LABEL: pre32idxpos256:
273; CHECK:       ; %bb.0:
274; CHECK-NEXT:    mov x8, x0
275; CHECK-NEXT:    add x0, x0, #256
276; CHECK-NEXT:    str w1, [x8, #256]
277; CHECK-NEXT:    ret
278  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 64
279  store i32 %spacing, ptr %incdec.ptr, align 4
280  ret ptr %incdec.ptr
281}
282
283define ptr @pre32idxneg256(ptr %ptr, i32 %spacing) {
284; CHECK-LABEL: pre32idxneg256:
285; CHECK:       ; %bb.0:
286; CHECK-NEXT:    str w1, [x0, #-256]!
287; CHECK-NEXT:    ret
288  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 -64
289  store i32 %spacing, ptr %incdec.ptr, align 4
290  ret ptr %incdec.ptr
291}
292
293define ptr @pre16(ptr %ptr, i16 %spacing) {
294; CHECK-LABEL: pre16:
295; CHECK:       ; %bb.0:
296; CHECK-NEXT:    strh w1, [x0, #4]!
297; CHECK-NEXT:    ret
298  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2
299  store i16 %spacing, ptr %incdec.ptr, align 4
300  ret ptr %incdec.ptr
301}
302
303define ptr @pre16idxpos256(ptr %ptr, i16 %spacing) {
304; CHECK-LABEL: pre16idxpos256:
305; CHECK:       ; %bb.0:
306; CHECK-NEXT:    mov x8, x0
307; CHECK-NEXT:    add x0, x0, #256
308; CHECK-NEXT:    strh w1, [x8, #256]
309; CHECK-NEXT:    ret
310  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 128
311  store i16 %spacing, ptr %incdec.ptr, align 4
312  ret ptr %incdec.ptr
313}
314
315define ptr @pre16idxneg256(ptr %ptr, i16 %spacing) {
316; CHECK-LABEL: pre16idxneg256:
317; CHECK:       ; %bb.0:
318; CHECK-NEXT:    strh w1, [x0, #-256]!
319; CHECK-NEXT:    ret
320  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 -128
321  store i16 %spacing, ptr %incdec.ptr, align 4
322  ret ptr %incdec.ptr
323}
324
325define ptr @pre8(ptr %ptr, i8 %spacing) {
326; CHECK-LABEL: pre8:
327; CHECK:       ; %bb.0:
328; CHECK-NEXT:    strb w1, [x0, #2]!
329; CHECK-NEXT:    ret
330  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2
331  store i8 %spacing, ptr %incdec.ptr, align 4
332  ret ptr %incdec.ptr
333}
334
335define ptr @pre8idxpos256(ptr %ptr, i8 %spacing) {
336; CHECK-LABEL: pre8idxpos256:
337; CHECK:       ; %bb.0:
338; CHECK-NEXT:    mov x8, x0
339; CHECK-NEXT:    add x0, x0, #256
340; CHECK-NEXT:    strb w1, [x8, #256]
341; CHECK-NEXT:    ret
342  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 256
343  store i8 %spacing, ptr %incdec.ptr, align 4
344  ret ptr %incdec.ptr
345}
346
347define ptr @pre8idxneg256(ptr %ptr, i8 %spacing) {
348; CHECK-LABEL: pre8idxneg256:
349; CHECK:       ; %bb.0:
350; CHECK-NEXT:    strb w1, [x0, #-256]!
351; CHECK-NEXT:    ret
352  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 -256
353  store i8 %spacing, ptr %incdec.ptr, align 4
354  ret ptr %incdec.ptr
355}
356
357define ptr @pretrunc64to32(ptr %ptr, i64 %spacing) {
358; CHECK-LABEL: pretrunc64to32:
359; CHECK:       ; %bb.0:
360; CHECK-NEXT:    str w1, [x0, #8]!
361; CHECK-NEXT:    ret
362  %incdec.ptr = getelementptr inbounds i32, ptr %ptr, i64 2
363  %trunc = trunc i64 %spacing to i32
364  store i32 %trunc, ptr %incdec.ptr, align 4
365  ret ptr %incdec.ptr
366}
367
368define ptr @pretrunc64to16(ptr %ptr, i64 %spacing) {
369; CHECK-LABEL: pretrunc64to16:
370; CHECK:       ; %bb.0:
371; CHECK-NEXT:    strh w1, [x0, #4]!
372; CHECK-NEXT:    ret
373  %incdec.ptr = getelementptr inbounds i16, ptr %ptr, i64 2
374  %trunc = trunc i64 %spacing to i16
375  store i16 %trunc, ptr %incdec.ptr, align 4
376  ret ptr %incdec.ptr
377}
378
379define ptr @pretrunc64to8(ptr %ptr, i64 %spacing) {
380; CHECK-LABEL: pretrunc64to8:
381; CHECK:       ; %bb.0:
382; CHECK-NEXT:    strb w1, [x0, #2]!
383; CHECK-NEXT:    ret
384  %incdec.ptr = getelementptr inbounds i8, ptr %ptr, i64 2
385  %trunc = trunc i64 %spacing to i8
386  store i8 %trunc, ptr %incdec.ptr, align 4
387  ret ptr %incdec.ptr
388}
389
390;-----
391; Pre-indexed loads
392;-----
393define ptr @preidxf64(ptr %src, ptr %out) {
394; CHECK-LABEL: preidxf64:
395; CHECK:       ; %bb.0:
396; CHECK-NEXT:    ldr d0, [x0, #8]!
397; CHECK-NEXT:    str d0, [x1]
398; CHECK-NEXT:    ret
399  %ptr = getelementptr inbounds double, ptr %src, i64 1
400  %tmp = load double, ptr %ptr, align 4
401  store double %tmp, ptr %out, align 4
402  ret ptr %ptr
403}
404
405define ptr @preidxf32(ptr %src, ptr %out) {
406; CHECK-LABEL: preidxf32:
407; CHECK:       ; %bb.0:
408; CHECK-NEXT:    ldr s0, [x0, #4]!
409; CHECK-NEXT:    str s0, [x1]
410; CHECK-NEXT:    ret
411  %ptr = getelementptr inbounds float, ptr %src, i64 1
412  %tmp = load float, ptr %ptr, align 4
413  store float %tmp, ptr %out, align 4
414  ret ptr %ptr
415}
416
417define ptr @preidxf16(ptr %src, ptr %out) {
418; CHECK-LABEL: preidxf16:
419; CHECK:       ; %bb.0:
420; CHECK-NEXT:    ldr h0, [x0, #2]!
421; CHECK-NEXT:    str h0, [x1]
422; CHECK-NEXT:    ret
423  %ptr = getelementptr inbounds half, ptr %src, i64 1
424  %tmp = load half, ptr %ptr, align 2
425  store half %tmp, ptr %out, align 2
426  ret ptr %ptr
427}
428
429define ptr @preidx64(ptr %src, ptr %out) {
430; CHECK-LABEL: preidx64:
431; CHECK:       ; %bb.0:
432; CHECK-NEXT:    ldr x8, [x0, #8]!
433; CHECK-NEXT:    str x8, [x1]
434; CHECK-NEXT:    ret
435  %ptr = getelementptr inbounds i64, ptr %src, i64 1
436  %tmp = load i64, ptr %ptr, align 4
437  store i64 %tmp, ptr %out, align 4
438  ret ptr %ptr
439}
440
441define ptr @preidx32(ptr %src, ptr %out) {
442; CHECK-LABEL: preidx32:
443; CHECK:       ; %bb.0:
444; CHECK-NEXT:    ldr w8, [x0, #4]!
445; CHECK-NEXT:    str w8, [x1]
446; CHECK-NEXT:    ret
447  %ptr = getelementptr inbounds i32, ptr %src, i64 1
448  %tmp = load i32, ptr %ptr, align 4
449  store i32 %tmp, ptr %out, align 4
450  ret ptr %ptr
451}
452
453define ptr @preidx16zext32(ptr %src, ptr %out) {
454; CHECK-LABEL: preidx16zext32:
455; CHECK:       ; %bb.0:
456; CHECK-NEXT:    ldrh w8, [x0, #2]!
457; CHECK-NEXT:    str w8, [x1]
458; CHECK-NEXT:    ret
459  %ptr = getelementptr inbounds i16, ptr %src, i64 1
460  %tmp = load i16, ptr %ptr, align 4
461  %ext = zext i16 %tmp to i32
462  store i32 %ext, ptr %out, align 4
463  ret ptr %ptr
464}
465
466define ptr @preidx16zext64(ptr %src, ptr %out) {
467; CHECK-LABEL: preidx16zext64:
468; CHECK:       ; %bb.0:
469; CHECK-NEXT:    ldrh w8, [x0, #2]!
470; CHECK-NEXT:    str x8, [x1]
471; CHECK-NEXT:    ret
472  %ptr = getelementptr inbounds i16, ptr %src, i64 1
473  %tmp = load i16, ptr %ptr, align 4
474  %ext = zext i16 %tmp to i64
475  store i64 %ext, ptr %out, align 4
476  ret ptr %ptr
477}
478
479define ptr @preidx8zext32(ptr %src, ptr %out) {
480; CHECK-LABEL: preidx8zext32:
481; CHECK:       ; %bb.0:
482; CHECK-NEXT:    ldrb w8, [x0, #1]!
483; CHECK-NEXT:    str w8, [x1]
484; CHECK-NEXT:    ret
485  %ptr = getelementptr inbounds i8, ptr %src, i64 1
486  %tmp = load i8, ptr %ptr, align 4
487  %ext = zext i8 %tmp to i32
488  store i32 %ext, ptr %out, align 4
489  ret ptr %ptr
490}
491
492define ptr @preidx8zext64(ptr %src, ptr %out) {
493; CHECK-LABEL: preidx8zext64:
494; CHECK:       ; %bb.0:
495; CHECK-NEXT:    ldrb w8, [x0, #1]!
496; CHECK-NEXT:    str x8, [x1]
497; CHECK-NEXT:    ret
498  %ptr = getelementptr inbounds i8, ptr %src, i64 1
499  %tmp = load i8, ptr %ptr, align 4
500  %ext = zext i8 %tmp to i64
501  store i64 %ext, ptr %out, align 4
502  ret ptr %ptr
503}
504
505define ptr @preidx32sext64(ptr %src, ptr %out) {
506; CHECK-LABEL: preidx32sext64:
507; CHECK:       ; %bb.0:
508; CHECK-NEXT:    ldrsw x8, [x0, #4]!
509; CHECK-NEXT:    str x8, [x1]
510; CHECK-NEXT:    ret
511  %ptr = getelementptr inbounds i32, ptr %src, i64 1
512  %tmp = load i32, ptr %ptr, align 4
513  %ext = sext i32 %tmp to i64
514  store i64 %ext, ptr %out, align 8
515  ret ptr %ptr
516}
517
518define ptr @preidx16sext32(ptr %src, ptr %out) {
519; CHECK-LABEL: preidx16sext32:
520; CHECK:       ; %bb.0:
521; CHECK-NEXT:    ldrsh w8, [x0, #2]!
522; CHECK-NEXT:    str w8, [x1]
523; CHECK-NEXT:    ret
524  %ptr = getelementptr inbounds i16, ptr %src, i64 1
525  %tmp = load i16, ptr %ptr, align 4
526  %ext = sext i16 %tmp to i32
527  store i32 %ext, ptr %out, align 4
528  ret ptr %ptr
529}
530
531define ptr @preidx16sext64(ptr %src, ptr %out) {
532; CHECK-LABEL: preidx16sext64:
533; CHECK:       ; %bb.0:
534; CHECK-NEXT:    ldrsh x8, [x0, #2]!
535; CHECK-NEXT:    str x8, [x1]
536; CHECK-NEXT:    ret
537  %ptr = getelementptr inbounds i16, ptr %src, i64 1
538  %tmp = load i16, ptr %ptr, align 4
539  %ext = sext i16 %tmp to i64
540  store i64 %ext, ptr %out, align 4
541  ret ptr %ptr
542}
543
544define ptr @preidx8sext32(ptr %src, ptr %out) {
545; CHECK-LABEL: preidx8sext32:
546; CHECK:       ; %bb.0:
547; CHECK-NEXT:    ldrsb w8, [x0, #1]!
548; CHECK-NEXT:    str w8, [x1]
549; CHECK-NEXT:    ret
550  %ptr = getelementptr inbounds i8, ptr %src, i64 1
551  %tmp = load i8, ptr %ptr, align 4
552  %ext = sext i8 %tmp to i32
553  store i32 %ext, ptr %out, align 4
554  ret ptr %ptr
555}
556
557define ptr @preidx8sext64(ptr %src, ptr %out) {
558; CHECK-LABEL: preidx8sext64:
559; CHECK:       ; %bb.0:
560; CHECK-NEXT:    ldrsb x8, [x0, #1]!
561; CHECK-NEXT:    str x8, [x1]
562; CHECK-NEXT:    ret
563  %ptr = getelementptr inbounds i8, ptr %src, i64 1
564  %tmp = load i8, ptr %ptr, align 4
565  %ext = sext i8 %tmp to i64
566  store i64 %ext, ptr %out, align 4
567  ret ptr %ptr
568}
569
570; This test checks if illegal post-index is generated
571
572define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp {
573; CHECK64-LABEL: postidx_clobber:
574; CHECK64:       ; %bb.0:
575; CHECK64-NEXT:    mov x8, x0
576; CHECK64-NEXT:    str x0, [x8], #8
577; CHECK64-NEXT:    mov x0, x8
578; CHECK64-NEXT:    ret
579;
580; GISEL-LABEL: postidx_clobber:
581; GISEL:       ; %bb.0:
582; GISEL-NEXT:    mov x8, x0
583; GISEL-NEXT:    str x0, [x8], #8
584; GISEL-NEXT:    mov x0, x8
585; GISEL-NEXT:    ret
586;
587; CHECK32-LABEL: postidx_clobber:
588; CHECK32:       ; %bb.0:
589; CHECK32-NEXT:    mov x8, x0
590; CHECK32-NEXT:    add w0, w8, #8
591; CHECK32-NEXT:    str w8, [x8]
592; CHECK32-NEXT:    ret
593; ret
594 store ptr %addr, ptr %addr
595 %newaddr = getelementptr i64, ptr %addr, i32 1
596 ret ptr %newaddr
597}
598
599define ptr @preidx32_sb(ptr %src, ptr %out) {
600; CHECK-LABEL: preidx32_sb:
601; CHECK:       ; %bb.0:
602; CHECK-NEXT:    ldrsb w8, [x0, #1]!
603; CHECK-NEXT:    str w8, [x1]
604; CHECK-NEXT:    ret
605  %ptr = getelementptr inbounds i8, ptr %src, i64 1
606  %tmp = load i8, ptr %ptr, align 1
607  %sext = sext i8 %tmp to i32
608  store i32 %sext, ptr %out, align 4
609  ret ptr %ptr
610}
611
612define ptr @preidx32_sh(ptr %src, ptr %out) {
613; CHECK-LABEL: preidx32_sh:
614; CHECK:       ; %bb.0:
615; CHECK-NEXT:    ldrsh w8, [x0, #2]!
616; CHECK-NEXT:    str w8, [x1]
617; CHECK-NEXT:    ret
618  %ptr = getelementptr inbounds i16, ptr %src, i64 1
619  %tmp = load i16, ptr %ptr, align 2
620  %sext = sext i16 %tmp to i32
621  store i32 %sext, ptr %out, align 4
622  ret ptr %ptr
623}
624
625define ptr @preidx64_sb(ptr %src, ptr %out) {
626; CHECK-LABEL: preidx64_sb:
627; CHECK:       ; %bb.0:
628; CHECK-NEXT:    ldrsb x8, [x0, #1]!
629; CHECK-NEXT:    str x8, [x1]
630; CHECK-NEXT:    ret
631  %ptr = getelementptr inbounds i8, ptr %src, i64 1
632  %tmp = load i8, ptr %ptr, align 1
633  %sext = sext i8 %tmp to i64
634  store i64 %sext, ptr %out, align 8
635  ret ptr %ptr
636}
637
638define ptr @preidx64_sh(ptr %src, ptr %out) {
639; CHECK-LABEL: preidx64_sh:
640; CHECK:       ; %bb.0:
641; CHECK-NEXT:    ldrsh x8, [x0, #2]!
642; CHECK-NEXT:    str x8, [x1]
643; CHECK-NEXT:    ret
644  %ptr = getelementptr inbounds i16, ptr %src, i64 1
645  %tmp = load i16, ptr %ptr, align 2
646  %sext = sext i16 %tmp to i64
647  store i64 %sext, ptr %out, align 8
648  ret ptr %ptr
649}
650
651define ptr @preidx64_sw(ptr %src, ptr %out) {
652; CHECK-LABEL: preidx64_sw:
653; CHECK:       ; %bb.0:
654; CHECK-NEXT:    ldrsw x8, [x0, #4]!
655; CHECK-NEXT:    str x8, [x1]
656; CHECK-NEXT:    ret
657  %ptr = getelementptr inbounds i32, ptr %src, i64 1
658  %tmp = load i32, ptr %ptr, align 2
659  %sext = sext i32 %tmp to i64
660  store i64 %sext, ptr %out, align 8
661  ret ptr %ptr
662}
663
664define ptr @postidx32_sb(ptr %src, ptr %out) {
665; CHECK-LABEL: postidx32_sb:
666; CHECK:       ; %bb.0:
667; CHECK-NEXT:    ldrsb w8, [x0], #1
668; CHECK-NEXT:    str w8, [x1]
669; CHECK-NEXT:    ret
670  %tmp = load i8, ptr %src, align 1
671  %ptr = getelementptr inbounds i8, ptr %src, i64 1
672  %sext = sext i8 %tmp to i32
673  store i32 %sext, ptr %out, align 4
674  ret ptr %ptr
675}
676
677define ptr @postidx32_sh(ptr %src, ptr %out) {
678; CHECK-LABEL: postidx32_sh:
679; CHECK:       ; %bb.0:
680; CHECK-NEXT:    ldrsh w8, [x0], #2
681; CHECK-NEXT:    str w8, [x1]
682; CHECK-NEXT:    ret
683  %tmp = load i16, ptr %src, align 2
684  %ptr = getelementptr inbounds i16, ptr %src, i64 1
685  %sext = sext i16 %tmp to i32
686  store i32 %sext, ptr %out, align 4
687  ret ptr %ptr
688}
689
690define ptr @postidx64_sb(ptr %src, ptr %out) {
691; CHECK-LABEL: postidx64_sb:
692; CHECK:       ; %bb.0:
693; CHECK-NEXT:    ldrsb x8, [x0], #1
694; CHECK-NEXT:    str x8, [x1]
695; CHECK-NEXT:    ret
696  %tmp = load i8, ptr %src, align 1
697  %ptr = getelementptr inbounds i8, ptr %src, i64 1
698  %sext = sext i8 %tmp to i64
699  store i64 %sext, ptr %out, align 8
700  ret ptr %ptr
701}
702
703define ptr @postidx64_sh(ptr %src, ptr %out) {
704; CHECK-LABEL: postidx64_sh:
705; CHECK:       ; %bb.0:
706; CHECK-NEXT:    ldrsh x8, [x0], #2
707; CHECK-NEXT:    str x8, [x1]
708; CHECK-NEXT:    ret
709  %tmp = load i16, ptr %src, align 2
710  %ptr = getelementptr inbounds i16, ptr %src, i64 1
711  %sext = sext i16 %tmp to i64
712  store i64 %sext, ptr %out, align 8
713  ret ptr %ptr
714}
715
716define ptr @postidx64_sw(ptr %src, ptr %out) {
717; CHECK-LABEL: postidx64_sw:
718; CHECK:       ; %bb.0:
719; CHECK-NEXT:    ldrsw x8, [x0], #4
720; CHECK-NEXT:    str x8, [x1]
721; CHECK-NEXT:    ret
722  %tmp = load i32, ptr %src, align 4
723  %ptr = getelementptr inbounds i32, ptr %src, i64 1
724  %sext = sext i32 %tmp to i64
725  store i64 %sext, ptr %out, align 8
726  ret ptr %ptr
727}
728