xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/ldst-opt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-linux-gnu -aarch64-atomic-cfg-tidy=0 -verify-machineinstrs -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; This file contains tests for the AArch64 load/store optimizer.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker%padding = type { i8*, i8*, i8*, i8* }
6*9880d681SAndroid Build Coastguard Worker%s.byte = type { i8, i8 }
7*9880d681SAndroid Build Coastguard Worker%s.halfword = type { i16, i16 }
8*9880d681SAndroid Build Coastguard Worker%s.word = type { i32, i32 }
9*9880d681SAndroid Build Coastguard Worker%s.doubleword = type { i64, i32 }
10*9880d681SAndroid Build Coastguard Worker%s.quadword = type { fp128, i32 }
11*9880d681SAndroid Build Coastguard Worker%s.float = type { float, i32 }
12*9880d681SAndroid Build Coastguard Worker%s.double = type { double, i32 }
13*9880d681SAndroid Build Coastguard Worker%struct.byte = type { %padding, %s.byte }
14*9880d681SAndroid Build Coastguard Worker%struct.halfword = type { %padding, %s.halfword }
15*9880d681SAndroid Build Coastguard Worker%struct.word = type { %padding, %s.word }
16*9880d681SAndroid Build Coastguard Worker%struct.doubleword = type { %padding, %s.doubleword }
17*9880d681SAndroid Build Coastguard Worker%struct.quadword = type { %padding, %s.quadword }
18*9880d681SAndroid Build Coastguard Worker%struct.float = type { %padding, %s.float }
19*9880d681SAndroid Build Coastguard Worker%struct.double = type { %padding, %s.double }
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; Check the following transform:
22*9880d681SAndroid Build Coastguard Worker;
23*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x0, #32]
24*9880d681SAndroid Build Coastguard Worker;  ...
25*9880d681SAndroid Build Coastguard Worker; add x0, x0, #32
26*9880d681SAndroid Build Coastguard Worker;  ->
27*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x0, #32]!
28*9880d681SAndroid Build Coastguard Worker;
29*9880d681SAndroid Build Coastguard Worker; with X being either w1, x1, s0, d0 or q0.
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdeclare void @bar_byte(%s.byte*, i8)
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-byte(%struct.byte* %ptr) nounwind {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-byte
35*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1, i32 0
38*9880d681SAndroid Build Coastguard Worker  %add = load i8, i8* %a, align 4
39*9880d681SAndroid Build Coastguard Worker  br label %bar
40*9880d681SAndroid Build Coastguard Workerbar:
41*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1
42*9880d681SAndroid Build Coastguard Worker  tail call void @bar_byte(%s.byte* %c, i8 %add)
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-byte(%struct.byte* %ptr, i8 %val) nounwind {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-byte
48*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1, i32 0
51*9880d681SAndroid Build Coastguard Worker  store i8 %val, i8* %a, align 4
52*9880d681SAndroid Build Coastguard Worker  br label %bar
53*9880d681SAndroid Build Coastguard Workerbar:
54*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.byte, %struct.byte* %ptr, i64 0, i32 1
55*9880d681SAndroid Build Coastguard Worker  tail call void @bar_byte(%s.byte* %c, i8 %val)
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdeclare void @bar_halfword(%s.halfword*, i16)
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-halfword(%struct.halfword* %ptr) nounwind {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-halfword
63*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1, i32 0
66*9880d681SAndroid Build Coastguard Worker  %add = load i16, i16* %a, align 4
67*9880d681SAndroid Build Coastguard Worker  br label %bar
68*9880d681SAndroid Build Coastguard Workerbar:
69*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1
70*9880d681SAndroid Build Coastguard Worker  tail call void @bar_halfword(%s.halfword* %c, i16 %add)
71*9880d681SAndroid Build Coastguard Worker  ret void
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-halfword(%struct.halfword* %ptr, i16 %val) nounwind {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-halfword
76*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1, i32 0
79*9880d681SAndroid Build Coastguard Worker  store i16 %val, i16* %a, align 4
80*9880d681SAndroid Build Coastguard Worker  br label %bar
81*9880d681SAndroid Build Coastguard Workerbar:
82*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.halfword, %struct.halfword* %ptr, i64 0, i32 1
83*9880d681SAndroid Build Coastguard Worker  tail call void @bar_halfword(%s.halfword* %c, i16 %val)
84*9880d681SAndroid Build Coastguard Worker  ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdeclare void @bar_word(%s.word*, i32)
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-word(%struct.word* %ptr) nounwind {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word
91*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0
94*9880d681SAndroid Build Coastguard Worker  %add = load i32, i32* %a, align 4
95*9880d681SAndroid Build Coastguard Worker  br label %bar
96*9880d681SAndroid Build Coastguard Workerbar:
97*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1
98*9880d681SAndroid Build Coastguard Worker  tail call void @bar_word(%s.word* %c, i32 %add)
99*9880d681SAndroid Build Coastguard Worker  ret void
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word(%struct.word* %ptr, i32 %val) nounwind {
103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word
104*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #32]!
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0
107*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %a, align 4
108*9880d681SAndroid Build Coastguard Worker  br label %bar
109*9880d681SAndroid Build Coastguard Workerbar:
110*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1
111*9880d681SAndroid Build Coastguard Worker  tail call void @bar_word(%s.word* %c, i32 %val)
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdeclare void @bar_doubleword(%s.doubleword*, i64)
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-doubleword(%struct.doubleword* %ptr) nounwind {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword
119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #32]!
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1, i32 0
122*9880d681SAndroid Build Coastguard Worker  %add = load i64, i64* %a, align 4
123*9880d681SAndroid Build Coastguard Worker  br label %bar
124*9880d681SAndroid Build Coastguard Workerbar:
125*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1
126*9880d681SAndroid Build Coastguard Worker  tail call void @bar_doubleword(%s.doubleword* %c, i64 %add)
127*9880d681SAndroid Build Coastguard Worker  ret void
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword(%struct.doubleword* %ptr, i64 %val) nounwind {
131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword
132*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #32]!
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1, i32 0
135*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %a, align 4
136*9880d681SAndroid Build Coastguard Worker  br label %bar
137*9880d681SAndroid Build Coastguard Workerbar:
138*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.doubleword, %struct.doubleword* %ptr, i64 0, i32 1
139*9880d681SAndroid Build Coastguard Worker  tail call void @bar_doubleword(%s.doubleword* %c, i64 %val)
140*9880d681SAndroid Build Coastguard Worker  ret void
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdeclare void @bar_quadword(%s.quadword*, fp128)
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-quadword(%struct.quadword* %ptr) nounwind {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword
147*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #32]!
148*9880d681SAndroid Build Coastguard Workerentry:
149*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1, i32 0
150*9880d681SAndroid Build Coastguard Worker  %add = load fp128, fp128* %a, align 4
151*9880d681SAndroid Build Coastguard Worker  br label %bar
152*9880d681SAndroid Build Coastguard Workerbar:
153*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1
154*9880d681SAndroid Build Coastguard Worker  tail call void @bar_quadword(%s.quadword* %c, fp128 %add)
155*9880d681SAndroid Build Coastguard Worker  ret void
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword(%struct.quadword* %ptr, fp128 %val) nounwind {
159*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword
160*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #32]!
161*9880d681SAndroid Build Coastguard Workerentry:
162*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1, i32 0
163*9880d681SAndroid Build Coastguard Worker  store fp128 %val, fp128* %a, align 4
164*9880d681SAndroid Build Coastguard Worker  br label %bar
165*9880d681SAndroid Build Coastguard Workerbar:
166*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.quadword, %struct.quadword* %ptr, i64 0, i32 1
167*9880d681SAndroid Build Coastguard Worker  tail call void @bar_quadword(%s.quadword* %c, fp128 %val)
168*9880d681SAndroid Build Coastguard Worker  ret void
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdeclare void @bar_float(%s.float*, float)
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-float(%struct.float* %ptr) nounwind {
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float
175*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #32]!
176*9880d681SAndroid Build Coastguard Workerentry:
177*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1, i32 0
178*9880d681SAndroid Build Coastguard Worker  %add = load float, float* %a, align 4
179*9880d681SAndroid Build Coastguard Worker  br label %bar
180*9880d681SAndroid Build Coastguard Workerbar:
181*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1
182*9880d681SAndroid Build Coastguard Worker  tail call void @bar_float(%s.float* %c, float %add)
183*9880d681SAndroid Build Coastguard Worker  ret void
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float(%struct.float* %ptr, float %val) nounwind {
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float
188*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #32]!
189*9880d681SAndroid Build Coastguard Workerentry:
190*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1, i32 0
191*9880d681SAndroid Build Coastguard Worker  store float %val, float* %a, align 4
192*9880d681SAndroid Build Coastguard Worker  br label %bar
193*9880d681SAndroid Build Coastguard Workerbar:
194*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.float, %struct.float* %ptr, i64 0, i32 1
195*9880d681SAndroid Build Coastguard Worker  tail call void @bar_float(%s.float* %c, float %val)
196*9880d681SAndroid Build Coastguard Worker  ret void
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Workerdeclare void @bar_double(%s.double*, double)
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdefine void @load-pre-indexed-double(%struct.double* %ptr) nounwind {
202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double
203*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #32]!
204*9880d681SAndroid Build Coastguard Workerentry:
205*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1, i32 0
206*9880d681SAndroid Build Coastguard Worker  %add = load double, double* %a, align 4
207*9880d681SAndroid Build Coastguard Worker  br label %bar
208*9880d681SAndroid Build Coastguard Workerbar:
209*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1
210*9880d681SAndroid Build Coastguard Worker  tail call void @bar_double(%s.double* %c, double %add)
211*9880d681SAndroid Build Coastguard Worker  ret void
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double(%struct.double* %ptr, double %val) nounwind {
215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double
216*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #32]!
217*9880d681SAndroid Build Coastguard Workerentry:
218*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1, i32 0
219*9880d681SAndroid Build Coastguard Worker  store double %val, double* %a, align 4
220*9880d681SAndroid Build Coastguard Worker  br label %bar
221*9880d681SAndroid Build Coastguard Workerbar:
222*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.double, %struct.double* %ptr, i64 0, i32 1
223*9880d681SAndroid Build Coastguard Worker  tail call void @bar_double(%s.double* %c, double %val)
224*9880d681SAndroid Build Coastguard Worker  ret void
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; Check the following transform:
228*9880d681SAndroid Build Coastguard Worker;
229*9880d681SAndroid Build Coastguard Worker; (ldp|stp) w1, w2 [x0, #32]
230*9880d681SAndroid Build Coastguard Worker;  ...
231*9880d681SAndroid Build Coastguard Worker; add x0, x0, #32
232*9880d681SAndroid Build Coastguard Worker;  ->
233*9880d681SAndroid Build Coastguard Worker; (ldp|stp) w1, w2, [x0, #32]!
234*9880d681SAndroid Build Coastguard Worker;
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerdefine void @load-pair-pre-indexed-word(%struct.word* %ptr) nounwind {
237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pair-pre-indexed-word
238*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w{{[0-9]+}}, w{{[0-9]+}}, [x0, #32]!
239*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x0, x0, #32
240*9880d681SAndroid Build Coastguard Workerentry:
241*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0
242*9880d681SAndroid Build Coastguard Worker  %a1 = load i32, i32* %a, align 4
243*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 1
244*9880d681SAndroid Build Coastguard Worker  %b1 = load i32, i32* %b, align 4
245*9880d681SAndroid Build Coastguard Worker  %add = add i32 %a1, %b1
246*9880d681SAndroid Build Coastguard Worker  br label %bar
247*9880d681SAndroid Build Coastguard Workerbar:
248*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1
249*9880d681SAndroid Build Coastguard Worker  tail call void @bar_word(%s.word* %c, i32 %add)
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-pre-indexed-word(%struct.word* %ptr, i32 %val) nounwind {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-pre-indexed-word
255*9880d681SAndroid Build Coastguard Worker; CHECK: stp w{{[0-9]+}}, w{{[0-9]+}}, [x0, #32]!
256*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add x0, x0, #32
257*9880d681SAndroid Build Coastguard Workerentry:
258*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 0
259*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %a, align 4
260*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1, i32 1
261*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %b, align 4
262*9880d681SAndroid Build Coastguard Worker  br label %bar
263*9880d681SAndroid Build Coastguard Workerbar:
264*9880d681SAndroid Build Coastguard Worker  %c = getelementptr inbounds %struct.word, %struct.word* %ptr, i64 0, i32 1
265*9880d681SAndroid Build Coastguard Worker  tail call void @bar_word(%s.word* %c, i32 %val)
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; Check the following transform:
270*9880d681SAndroid Build Coastguard Worker;
271*9880d681SAndroid Build Coastguard Worker; add x8, x8, #16
272*9880d681SAndroid Build Coastguard Worker;  ...
273*9880d681SAndroid Build Coastguard Worker; ldr X, [x8]
274*9880d681SAndroid Build Coastguard Worker;  ->
275*9880d681SAndroid Build Coastguard Worker; ldr X, [x8, #16]!
276*9880d681SAndroid Build Coastguard Worker;
277*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0.
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker%pre.struct.i32 = type { i32, i32, i32, i32, i32}
280*9880d681SAndroid Build Coastguard Worker%pre.struct.i64 = type { i32, i64, i64, i64, i64}
281*9880d681SAndroid Build Coastguard Worker%pre.struct.i128 = type { i32, <2 x i64>, <2 x i64>, <2 x i64>}
282*9880d681SAndroid Build Coastguard Worker%pre.struct.float = type { i32, float, float, float}
283*9880d681SAndroid Build Coastguard Worker%pre.struct.double = type { i32, double, double, double}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine i32 @load-pre-indexed-word2(%pre.struct.i32** %this, i1 %cond,
286*9880d681SAndroid Build Coastguard Worker                                   %pre.struct.i32* %load2) nounwind {
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word2
288*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #4]!
289*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
290*9880d681SAndroid Build Coastguard Workerif.then:
291*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i32*, %pre.struct.i32** %this
292*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 1
293*9880d681SAndroid Build Coastguard Worker  br label %return
294*9880d681SAndroid Build Coastguard Workerif.end:
295*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 2
296*9880d681SAndroid Build Coastguard Worker  br label %return
297*9880d681SAndroid Build Coastguard Workerreturn:
298*9880d681SAndroid Build Coastguard Worker  %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ]
299*9880d681SAndroid Build Coastguard Worker  %ret = load i32, i32* %retptr
300*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
301*9880d681SAndroid Build Coastguard Worker}
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerdefine i64 @load-pre-indexed-doubleword2(%pre.struct.i64** %this, i1 %cond,
304*9880d681SAndroid Build Coastguard Worker                                         %pre.struct.i64* %load2) nounwind {
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword2
306*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #8]!
307*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
308*9880d681SAndroid Build Coastguard Workerif.then:
309*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i64*, %pre.struct.i64** %this
310*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 1
311*9880d681SAndroid Build Coastguard Worker  br label %return
312*9880d681SAndroid Build Coastguard Workerif.end:
313*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 2
314*9880d681SAndroid Build Coastguard Worker  br label %return
315*9880d681SAndroid Build Coastguard Workerreturn:
316*9880d681SAndroid Build Coastguard Worker  %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ]
317*9880d681SAndroid Build Coastguard Worker  %ret = load i64, i64* %retptr
318*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @load-pre-indexed-quadword2(%pre.struct.i128** %this, i1 %cond,
322*9880d681SAndroid Build Coastguard Worker                                             %pre.struct.i128* %load2) nounwind {
323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword2
324*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #16]!
325*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
326*9880d681SAndroid Build Coastguard Workerif.then:
327*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i128*, %pre.struct.i128** %this
328*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 1
329*9880d681SAndroid Build Coastguard Worker  br label %return
330*9880d681SAndroid Build Coastguard Workerif.end:
331*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 2
332*9880d681SAndroid Build Coastguard Worker  br label %return
333*9880d681SAndroid Build Coastguard Workerreturn:
334*9880d681SAndroid Build Coastguard Worker  %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ]
335*9880d681SAndroid Build Coastguard Worker  %ret = load <2 x i64>, <2 x i64>* %retptr
336*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerdefine float @load-pre-indexed-float2(%pre.struct.float** %this, i1 %cond,
340*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.float* %load2) nounwind {
341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float2
342*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #4]!
343*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
344*9880d681SAndroid Build Coastguard Workerif.then:
345*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.float*, %pre.struct.float** %this
346*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 1
347*9880d681SAndroid Build Coastguard Worker  br label %return
348*9880d681SAndroid Build Coastguard Workerif.end:
349*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 2
350*9880d681SAndroid Build Coastguard Worker  br label %return
351*9880d681SAndroid Build Coastguard Workerreturn:
352*9880d681SAndroid Build Coastguard Worker  %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ]
353*9880d681SAndroid Build Coastguard Worker  %ret = load float, float* %retptr
354*9880d681SAndroid Build Coastguard Worker  ret float %ret
355*9880d681SAndroid Build Coastguard Worker}
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Workerdefine double @load-pre-indexed-double2(%pre.struct.double** %this, i1 %cond,
358*9880d681SAndroid Build Coastguard Worker                                        %pre.struct.double* %load2) nounwind {
359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double2
360*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #8]!
361*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
362*9880d681SAndroid Build Coastguard Workerif.then:
363*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.double*, %pre.struct.double** %this
364*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 1
365*9880d681SAndroid Build Coastguard Worker  br label %return
366*9880d681SAndroid Build Coastguard Workerif.end:
367*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 2
368*9880d681SAndroid Build Coastguard Worker  br label %return
369*9880d681SAndroid Build Coastguard Workerreturn:
370*9880d681SAndroid Build Coastguard Worker  %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ]
371*9880d681SAndroid Build Coastguard Worker  %ret = load double, double* %retptr
372*9880d681SAndroid Build Coastguard Worker  ret double %ret
373*9880d681SAndroid Build Coastguard Worker}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdefine i32 @load-pre-indexed-word3(%pre.struct.i32** %this, i1 %cond,
376*9880d681SAndroid Build Coastguard Worker                                   %pre.struct.i32* %load2) nounwind {
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-word3
378*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}, #12]!
379*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
380*9880d681SAndroid Build Coastguard Workerif.then:
381*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i32*, %pre.struct.i32** %this
382*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 3
383*9880d681SAndroid Build Coastguard Worker  br label %return
384*9880d681SAndroid Build Coastguard Workerif.end:
385*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 4
386*9880d681SAndroid Build Coastguard Worker  br label %return
387*9880d681SAndroid Build Coastguard Workerreturn:
388*9880d681SAndroid Build Coastguard Worker  %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ]
389*9880d681SAndroid Build Coastguard Worker  %ret = load i32, i32* %retptr
390*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
391*9880d681SAndroid Build Coastguard Worker}
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerdefine i64 @load-pre-indexed-doubleword3(%pre.struct.i64** %this, i1 %cond,
394*9880d681SAndroid Build Coastguard Worker                                         %pre.struct.i64* %load2) nounwind {
395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-doubleword3
396*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}, #16]!
397*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
398*9880d681SAndroid Build Coastguard Workerif.then:
399*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i64*, %pre.struct.i64** %this
400*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 2
401*9880d681SAndroid Build Coastguard Worker  br label %return
402*9880d681SAndroid Build Coastguard Workerif.end:
403*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 3
404*9880d681SAndroid Build Coastguard Worker  br label %return
405*9880d681SAndroid Build Coastguard Workerreturn:
406*9880d681SAndroid Build Coastguard Worker  %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ]
407*9880d681SAndroid Build Coastguard Worker  %ret = load i64, i64* %retptr
408*9880d681SAndroid Build Coastguard Worker  ret i64 %ret
409*9880d681SAndroid Build Coastguard Worker}
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @load-pre-indexed-quadword3(%pre.struct.i128** %this, i1 %cond,
412*9880d681SAndroid Build Coastguard Worker                                             %pre.struct.i128* %load2) nounwind {
413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-quadword3
414*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}, #32]!
415*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
416*9880d681SAndroid Build Coastguard Workerif.then:
417*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i128*, %pre.struct.i128** %this
418*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 2
419*9880d681SAndroid Build Coastguard Worker  br label %return
420*9880d681SAndroid Build Coastguard Workerif.end:
421*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 3
422*9880d681SAndroid Build Coastguard Worker  br label %return
423*9880d681SAndroid Build Coastguard Workerreturn:
424*9880d681SAndroid Build Coastguard Worker  %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ]
425*9880d681SAndroid Build Coastguard Worker  %ret = load <2 x i64>, <2 x i64>* %retptr
426*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %ret
427*9880d681SAndroid Build Coastguard Worker}
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerdefine float @load-pre-indexed-float3(%pre.struct.float** %this, i1 %cond,
430*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.float* %load2) nounwind {
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-float3
432*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}, #8]!
433*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
434*9880d681SAndroid Build Coastguard Workerif.then:
435*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.float*, %pre.struct.float** %this
436*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 2
437*9880d681SAndroid Build Coastguard Worker  br label %return
438*9880d681SAndroid Build Coastguard Workerif.end:
439*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 3
440*9880d681SAndroid Build Coastguard Worker  br label %return
441*9880d681SAndroid Build Coastguard Workerreturn:
442*9880d681SAndroid Build Coastguard Worker  %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ]
443*9880d681SAndroid Build Coastguard Worker  %ret = load float, float* %retptr
444*9880d681SAndroid Build Coastguard Worker  ret float %ret
445*9880d681SAndroid Build Coastguard Worker}
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Workerdefine double @load-pre-indexed-double3(%pre.struct.double** %this, i1 %cond,
448*9880d681SAndroid Build Coastguard Worker                                        %pre.struct.double* %load2) nounwind {
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-pre-indexed-double3
450*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}, #16]!
451*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
452*9880d681SAndroid Build Coastguard Workerif.then:
453*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.double*, %pre.struct.double** %this
454*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 2
455*9880d681SAndroid Build Coastguard Worker  br label %return
456*9880d681SAndroid Build Coastguard Workerif.end:
457*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 3
458*9880d681SAndroid Build Coastguard Worker  br label %return
459*9880d681SAndroid Build Coastguard Workerreturn:
460*9880d681SAndroid Build Coastguard Worker  %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ]
461*9880d681SAndroid Build Coastguard Worker  %ret = load double, double* %retptr
462*9880d681SAndroid Build Coastguard Worker  ret double %ret
463*9880d681SAndroid Build Coastguard Worker}
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker; Check the following transform:
466*9880d681SAndroid Build Coastguard Worker;
467*9880d681SAndroid Build Coastguard Worker; add x8, x8, #16
468*9880d681SAndroid Build Coastguard Worker;  ...
469*9880d681SAndroid Build Coastguard Worker; str X, [x8]
470*9880d681SAndroid Build Coastguard Worker;  ->
471*9880d681SAndroid Build Coastguard Worker; str X, [x8, #16]!
472*9880d681SAndroid Build Coastguard Worker;
473*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0.
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word2(%pre.struct.i32** %this, i1 %cond,
476*9880d681SAndroid Build Coastguard Worker                                     %pre.struct.i32* %load2,
477*9880d681SAndroid Build Coastguard Worker                                     i32 %val) nounwind {
478*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word2
479*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #4]!
480*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
481*9880d681SAndroid Build Coastguard Workerif.then:
482*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i32*, %pre.struct.i32** %this
483*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 1
484*9880d681SAndroid Build Coastguard Worker  br label %return
485*9880d681SAndroid Build Coastguard Workerif.end:
486*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 2
487*9880d681SAndroid Build Coastguard Worker  br label %return
488*9880d681SAndroid Build Coastguard Workerreturn:
489*9880d681SAndroid Build Coastguard Worker  %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ]
490*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %retptr
491*9880d681SAndroid Build Coastguard Worker  ret void
492*9880d681SAndroid Build Coastguard Worker}
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword2(%pre.struct.i64** %this, i1 %cond,
495*9880d681SAndroid Build Coastguard Worker                                           %pre.struct.i64* %load2,
496*9880d681SAndroid Build Coastguard Worker                                           i64 %val) nounwind {
497*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword2
498*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #8]!
499*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
500*9880d681SAndroid Build Coastguard Workerif.then:
501*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i64*, %pre.struct.i64** %this
502*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 1
503*9880d681SAndroid Build Coastguard Worker  br label %return
504*9880d681SAndroid Build Coastguard Workerif.end:
505*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 2
506*9880d681SAndroid Build Coastguard Worker  br label %return
507*9880d681SAndroid Build Coastguard Workerreturn:
508*9880d681SAndroid Build Coastguard Worker  %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ]
509*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %retptr
510*9880d681SAndroid Build Coastguard Worker  ret void
511*9880d681SAndroid Build Coastguard Worker}
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword2(%pre.struct.i128** %this, i1 %cond,
514*9880d681SAndroid Build Coastguard Worker                                         %pre.struct.i128* %load2,
515*9880d681SAndroid Build Coastguard Worker                                         <2 x i64> %val) nounwind {
516*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword2
517*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #16]!
518*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
519*9880d681SAndroid Build Coastguard Workerif.then:
520*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i128*, %pre.struct.i128** %this
521*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 1
522*9880d681SAndroid Build Coastguard Worker  br label %return
523*9880d681SAndroid Build Coastguard Workerif.end:
524*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 2
525*9880d681SAndroid Build Coastguard Worker  br label %return
526*9880d681SAndroid Build Coastguard Workerreturn:
527*9880d681SAndroid Build Coastguard Worker  %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ]
528*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %val, <2 x i64>* %retptr
529*9880d681SAndroid Build Coastguard Worker  ret void
530*9880d681SAndroid Build Coastguard Worker}
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float2(%pre.struct.float** %this, i1 %cond,
533*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.float* %load2,
534*9880d681SAndroid Build Coastguard Worker                                      float %val) nounwind {
535*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float2
536*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #4]!
537*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
538*9880d681SAndroid Build Coastguard Workerif.then:
539*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.float*, %pre.struct.float** %this
540*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 1
541*9880d681SAndroid Build Coastguard Worker  br label %return
542*9880d681SAndroid Build Coastguard Workerif.end:
543*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 2
544*9880d681SAndroid Build Coastguard Worker  br label %return
545*9880d681SAndroid Build Coastguard Workerreturn:
546*9880d681SAndroid Build Coastguard Worker  %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ]
547*9880d681SAndroid Build Coastguard Worker  store float %val, float* %retptr
548*9880d681SAndroid Build Coastguard Worker  ret void
549*9880d681SAndroid Build Coastguard Worker}
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double2(%pre.struct.double** %this, i1 %cond,
552*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.double* %load2,
553*9880d681SAndroid Build Coastguard Worker                                      double %val) nounwind {
554*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double2
555*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #8]!
556*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
557*9880d681SAndroid Build Coastguard Workerif.then:
558*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.double*, %pre.struct.double** %this
559*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 1
560*9880d681SAndroid Build Coastguard Worker  br label %return
561*9880d681SAndroid Build Coastguard Workerif.end:
562*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 2
563*9880d681SAndroid Build Coastguard Worker  br label %return
564*9880d681SAndroid Build Coastguard Workerreturn:
565*9880d681SAndroid Build Coastguard Worker  %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ]
566*9880d681SAndroid Build Coastguard Worker  store double %val, double* %retptr
567*9880d681SAndroid Build Coastguard Worker  ret void
568*9880d681SAndroid Build Coastguard Worker}
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-word3(%pre.struct.i32** %this, i1 %cond,
571*9880d681SAndroid Build Coastguard Worker                                     %pre.struct.i32* %load2,
572*9880d681SAndroid Build Coastguard Worker                                     i32 %val) nounwind {
573*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-word3
574*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}, #12]!
575*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
576*9880d681SAndroid Build Coastguard Workerif.then:
577*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i32*, %pre.struct.i32** %this
578*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load1, i64 0, i32 3
579*9880d681SAndroid Build Coastguard Worker  br label %return
580*9880d681SAndroid Build Coastguard Workerif.end:
581*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i32, %pre.struct.i32* %load2, i64 0, i32 4
582*9880d681SAndroid Build Coastguard Worker  br label %return
583*9880d681SAndroid Build Coastguard Workerreturn:
584*9880d681SAndroid Build Coastguard Worker  %retptr = phi i32* [ %gep1, %if.then ], [ %gep2, %if.end ]
585*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %retptr
586*9880d681SAndroid Build Coastguard Worker  ret void
587*9880d681SAndroid Build Coastguard Worker}
588*9880d681SAndroid Build Coastguard Worker
589*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-doubleword3(%pre.struct.i64** %this, i1 %cond,
590*9880d681SAndroid Build Coastguard Worker                                           %pre.struct.i64* %load2,
591*9880d681SAndroid Build Coastguard Worker                                           i64 %val) nounwind {
592*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-doubleword3
593*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}, #24]!
594*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
595*9880d681SAndroid Build Coastguard Workerif.then:
596*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i64*, %pre.struct.i64** %this
597*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load1, i64 0, i32 3
598*9880d681SAndroid Build Coastguard Worker  br label %return
599*9880d681SAndroid Build Coastguard Workerif.end:
600*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i64, %pre.struct.i64* %load2, i64 0, i32 4
601*9880d681SAndroid Build Coastguard Worker  br label %return
602*9880d681SAndroid Build Coastguard Workerreturn:
603*9880d681SAndroid Build Coastguard Worker  %retptr = phi i64* [ %gep1, %if.then ], [ %gep2, %if.end ]
604*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %retptr
605*9880d681SAndroid Build Coastguard Worker  ret void
606*9880d681SAndroid Build Coastguard Worker}
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-quadword3(%pre.struct.i128** %this, i1 %cond,
609*9880d681SAndroid Build Coastguard Worker                                         %pre.struct.i128* %load2,
610*9880d681SAndroid Build Coastguard Worker                                         <2 x i64> %val) nounwind {
611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-quadword3
612*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}, #32]!
613*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
614*9880d681SAndroid Build Coastguard Workerif.then:
615*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.i128*, %pre.struct.i128** %this
616*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load1, i64 0, i32 2
617*9880d681SAndroid Build Coastguard Worker  br label %return
618*9880d681SAndroid Build Coastguard Workerif.end:
619*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.i128, %pre.struct.i128* %load2, i64 0, i32 3
620*9880d681SAndroid Build Coastguard Worker  br label %return
621*9880d681SAndroid Build Coastguard Workerreturn:
622*9880d681SAndroid Build Coastguard Worker  %retptr = phi <2 x i64>* [ %gep1, %if.then ], [ %gep2, %if.end ]
623*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %val, <2 x i64>* %retptr
624*9880d681SAndroid Build Coastguard Worker  ret void
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-float3(%pre.struct.float** %this, i1 %cond,
628*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.float* %load2,
629*9880d681SAndroid Build Coastguard Worker                                      float %val) nounwind {
630*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-float3
631*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}, #8]!
632*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
633*9880d681SAndroid Build Coastguard Workerif.then:
634*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.float*, %pre.struct.float** %this
635*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load1, i64 0, i32 2
636*9880d681SAndroid Build Coastguard Worker  br label %return
637*9880d681SAndroid Build Coastguard Workerif.end:
638*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.float, %pre.struct.float* %load2, i64 0, i32 3
639*9880d681SAndroid Build Coastguard Worker  br label %return
640*9880d681SAndroid Build Coastguard Workerreturn:
641*9880d681SAndroid Build Coastguard Worker  %retptr = phi float* [ %gep1, %if.then ], [ %gep2, %if.end ]
642*9880d681SAndroid Build Coastguard Worker  store float %val, float* %retptr
643*9880d681SAndroid Build Coastguard Worker  ret void
644*9880d681SAndroid Build Coastguard Worker}
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Workerdefine void @store-pre-indexed-double3(%pre.struct.double** %this, i1 %cond,
647*9880d681SAndroid Build Coastguard Worker                                      %pre.struct.double* %load2,
648*9880d681SAndroid Build Coastguard Worker                                      double %val) nounwind {
649*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pre-indexed-double3
650*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}, #16]!
651*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %if.end
652*9880d681SAndroid Build Coastguard Workerif.then:
653*9880d681SAndroid Build Coastguard Worker  %load1 = load %pre.struct.double*, %pre.struct.double** %this
654*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load1, i64 0, i32 2
655*9880d681SAndroid Build Coastguard Worker  br label %return
656*9880d681SAndroid Build Coastguard Workerif.end:
657*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds %pre.struct.double, %pre.struct.double* %load2, i64 0, i32 3
658*9880d681SAndroid Build Coastguard Worker  br label %return
659*9880d681SAndroid Build Coastguard Workerreturn:
660*9880d681SAndroid Build Coastguard Worker  %retptr = phi double* [ %gep1, %if.then ], [ %gep2, %if.end ]
661*9880d681SAndroid Build Coastguard Worker  store double %val, double* %retptr
662*9880d681SAndroid Build Coastguard Worker  ret void
663*9880d681SAndroid Build Coastguard Worker}
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker; Check the following transform:
666*9880d681SAndroid Build Coastguard Worker;
667*9880d681SAndroid Build Coastguard Worker; ldr X, [x20]
668*9880d681SAndroid Build Coastguard Worker;  ...
669*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32
670*9880d681SAndroid Build Coastguard Worker;  ->
671*9880d681SAndroid Build Coastguard Worker; ldr X, [x20], #32
672*9880d681SAndroid Build Coastguard Worker;
673*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0.
674*9880d681SAndroid Build Coastguard Worker
675*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-byte(i8* %array, i64 %count) nounwind {
676*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-byte
677*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb w{{[0-9]+}}, [x{{[0-9]+}}], #4
678*9880d681SAndroid Build Coastguard Workerentry:
679*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i8, i8* %array, i64 2
680*9880d681SAndroid Build Coastguard Worker  br label %body
681*9880d681SAndroid Build Coastguard Worker
682*9880d681SAndroid Build Coastguard Workerbody:
683*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i8* [ %gep3, %body ], [ %gep1, %entry ]
684*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
685*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i8, i8* %iv2, i64 -1
686*9880d681SAndroid Build Coastguard Worker  %load = load i8, i8* %gep2
687*9880d681SAndroid Build Coastguard Worker  call void @use-byte(i8 %load)
688*9880d681SAndroid Build Coastguard Worker  %load2 = load i8, i8* %iv2
689*9880d681SAndroid Build Coastguard Worker  call void @use-byte(i8 %load2)
690*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
691*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i8, i8* %iv2, i64 4
692*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
693*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
694*9880d681SAndroid Build Coastguard Worker
695*9880d681SAndroid Build Coastguard Workerexit:
696*9880d681SAndroid Build Coastguard Worker  ret void
697*9880d681SAndroid Build Coastguard Worker}
698*9880d681SAndroid Build Coastguard Worker
699*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-halfword(i16* %array, i64 %count) nounwind {
700*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-halfword
701*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh w{{[0-9]+}}, [x{{[0-9]+}}], #8
702*9880d681SAndroid Build Coastguard Workerentry:
703*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i16, i16* %array, i64 2
704*9880d681SAndroid Build Coastguard Worker  br label %body
705*9880d681SAndroid Build Coastguard Worker
706*9880d681SAndroid Build Coastguard Workerbody:
707*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i16* [ %gep3, %body ], [ %gep1, %entry ]
708*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
709*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i16, i16* %iv2, i64 -1
710*9880d681SAndroid Build Coastguard Worker  %load = load i16, i16* %gep2
711*9880d681SAndroid Build Coastguard Worker  call void @use-halfword(i16 %load)
712*9880d681SAndroid Build Coastguard Worker  %load2 = load i16, i16* %iv2
713*9880d681SAndroid Build Coastguard Worker  call void @use-halfword(i16 %load2)
714*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
715*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i16, i16* %iv2, i64 4
716*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
717*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
718*9880d681SAndroid Build Coastguard Worker
719*9880d681SAndroid Build Coastguard Workerexit:
720*9880d681SAndroid Build Coastguard Worker  ret void
721*9880d681SAndroid Build Coastguard Worker}
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-word(i32* %array, i64 %count) nounwind {
724*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-word
725*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}], #16
726*9880d681SAndroid Build Coastguard Workerentry:
727*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32* %array, i64 2
728*9880d681SAndroid Build Coastguard Worker  br label %body
729*9880d681SAndroid Build Coastguard Worker
730*9880d681SAndroid Build Coastguard Workerbody:
731*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i32* [ %gep3, %body ], [ %gep1, %entry ]
732*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
733*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i32, i32* %iv2, i64 -1
734*9880d681SAndroid Build Coastguard Worker  %load = load i32, i32* %gep2
735*9880d681SAndroid Build Coastguard Worker  call void @use-word(i32 %load)
736*9880d681SAndroid Build Coastguard Worker  %load2 = load i32, i32* %iv2
737*9880d681SAndroid Build Coastguard Worker  call void @use-word(i32 %load2)
738*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
739*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i32, i32* %iv2, i64 4
740*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
741*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Workerexit:
744*9880d681SAndroid Build Coastguard Worker  ret void
745*9880d681SAndroid Build Coastguard Worker}
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-doubleword(i64* %array, i64 %count) nounwind {
748*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-doubleword
749*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}], #32
750*9880d681SAndroid Build Coastguard Workerentry:
751*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i64, i64* %array, i64 2
752*9880d681SAndroid Build Coastguard Worker  br label %body
753*9880d681SAndroid Build Coastguard Worker
754*9880d681SAndroid Build Coastguard Workerbody:
755*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i64* [ %gep3, %body ], [ %gep1, %entry ]
756*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
757*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i64, i64* %iv2, i64 -1
758*9880d681SAndroid Build Coastguard Worker  %load = load i64, i64* %gep2
759*9880d681SAndroid Build Coastguard Worker  call void @use-doubleword(i64 %load)
760*9880d681SAndroid Build Coastguard Worker  %load2 = load i64, i64* %iv2
761*9880d681SAndroid Build Coastguard Worker  call void @use-doubleword(i64 %load2)
762*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
763*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i64, i64* %iv2, i64 4
764*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
765*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
766*9880d681SAndroid Build Coastguard Worker
767*9880d681SAndroid Build Coastguard Workerexit:
768*9880d681SAndroid Build Coastguard Worker  ret void
769*9880d681SAndroid Build Coastguard Worker}
770*9880d681SAndroid Build Coastguard Worker
771*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-quadword(<2 x i64>* %array, i64 %count) nounwind {
772*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-quadword
773*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}], #64
774*9880d681SAndroid Build Coastguard Workerentry:
775*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr <2 x i64>, <2 x i64>* %array, i64 2
776*9880d681SAndroid Build Coastguard Worker  br label %body
777*9880d681SAndroid Build Coastguard Worker
778*9880d681SAndroid Build Coastguard Workerbody:
779*9880d681SAndroid Build Coastguard Worker  %iv2 = phi <2 x i64>* [ %gep3, %body ], [ %gep1, %entry ]
780*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
781*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 -1
782*9880d681SAndroid Build Coastguard Worker  %load = load <2 x i64>, <2 x i64>* %gep2
783*9880d681SAndroid Build Coastguard Worker  call void @use-quadword(<2 x i64> %load)
784*9880d681SAndroid Build Coastguard Worker  %load2 = load <2 x i64>, <2 x i64>* %iv2
785*9880d681SAndroid Build Coastguard Worker  call void @use-quadword(<2 x i64> %load2)
786*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
787*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 4
788*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
789*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
790*9880d681SAndroid Build Coastguard Worker
791*9880d681SAndroid Build Coastguard Workerexit:
792*9880d681SAndroid Build Coastguard Worker  ret void
793*9880d681SAndroid Build Coastguard Worker}
794*9880d681SAndroid Build Coastguard Worker
795*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-float(float* %array, i64 %count) nounwind {
796*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-float
797*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}], #16
798*9880d681SAndroid Build Coastguard Workerentry:
799*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr float, float* %array, i64 2
800*9880d681SAndroid Build Coastguard Worker  br label %body
801*9880d681SAndroid Build Coastguard Worker
802*9880d681SAndroid Build Coastguard Workerbody:
803*9880d681SAndroid Build Coastguard Worker  %iv2 = phi float* [ %gep3, %body ], [ %gep1, %entry ]
804*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
805*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr float, float* %iv2, i64 -1
806*9880d681SAndroid Build Coastguard Worker  %load = load float, float* %gep2
807*9880d681SAndroid Build Coastguard Worker  call void @use-float(float %load)
808*9880d681SAndroid Build Coastguard Worker  %load2 = load float, float* %iv2
809*9880d681SAndroid Build Coastguard Worker  call void @use-float(float %load2)
810*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
811*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr float, float* %iv2, i64 4
812*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
813*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
814*9880d681SAndroid Build Coastguard Worker
815*9880d681SAndroid Build Coastguard Workerexit:
816*9880d681SAndroid Build Coastguard Worker  ret void
817*9880d681SAndroid Build Coastguard Worker}
818*9880d681SAndroid Build Coastguard Worker
819*9880d681SAndroid Build Coastguard Workerdefine void @load-post-indexed-double(double* %array, i64 %count) nounwind {
820*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load-post-indexed-double
821*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}], #32
822*9880d681SAndroid Build Coastguard Workerentry:
823*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr double, double* %array, i64 2
824*9880d681SAndroid Build Coastguard Worker  br label %body
825*9880d681SAndroid Build Coastguard Worker
826*9880d681SAndroid Build Coastguard Workerbody:
827*9880d681SAndroid Build Coastguard Worker  %iv2 = phi double* [ %gep3, %body ], [ %gep1, %entry ]
828*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
829*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr double, double* %iv2, i64 -1
830*9880d681SAndroid Build Coastguard Worker  %load = load double, double* %gep2
831*9880d681SAndroid Build Coastguard Worker  call void @use-double(double %load)
832*9880d681SAndroid Build Coastguard Worker  %load2 = load double, double* %iv2
833*9880d681SAndroid Build Coastguard Worker  call void @use-double(double %load2)
834*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
835*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr double, double* %iv2, i64 4
836*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
837*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
838*9880d681SAndroid Build Coastguard Worker
839*9880d681SAndroid Build Coastguard Workerexit:
840*9880d681SAndroid Build Coastguard Worker  ret void
841*9880d681SAndroid Build Coastguard Worker}
842*9880d681SAndroid Build Coastguard Worker
843*9880d681SAndroid Build Coastguard Worker; Check the following transform:
844*9880d681SAndroid Build Coastguard Worker;
845*9880d681SAndroid Build Coastguard Worker; str X, [x20]
846*9880d681SAndroid Build Coastguard Worker;  ...
847*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32
848*9880d681SAndroid Build Coastguard Worker;  ->
849*9880d681SAndroid Build Coastguard Worker; str X, [x20], #32
850*9880d681SAndroid Build Coastguard Worker;
851*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0.
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-byte(i8* %array, i64 %count, i8 %val) nounwind {
854*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-byte
855*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9]+}}, [x{{[0-9]+}}], #4
856*9880d681SAndroid Build Coastguard Workerentry:
857*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i8, i8* %array, i64 2
858*9880d681SAndroid Build Coastguard Worker  br label %body
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerbody:
861*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i8* [ %gep3, %body ], [ %gep1, %entry ]
862*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
863*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i8, i8* %iv2, i64 -1
864*9880d681SAndroid Build Coastguard Worker  %load = load i8, i8* %gep2
865*9880d681SAndroid Build Coastguard Worker  call void @use-byte(i8 %load)
866*9880d681SAndroid Build Coastguard Worker  store i8 %val, i8* %iv2
867*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
868*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i8, i8* %iv2, i64 4
869*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
870*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
871*9880d681SAndroid Build Coastguard Worker
872*9880d681SAndroid Build Coastguard Workerexit:
873*9880d681SAndroid Build Coastguard Worker  ret void
874*9880d681SAndroid Build Coastguard Worker}
875*9880d681SAndroid Build Coastguard Worker
876*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-halfword(i16* %array, i64 %count, i16 %val) nounwind {
877*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-halfword
878*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9]+}}, [x{{[0-9]+}}], #8
879*9880d681SAndroid Build Coastguard Workerentry:
880*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i16, i16* %array, i64 2
881*9880d681SAndroid Build Coastguard Worker  br label %body
882*9880d681SAndroid Build Coastguard Worker
883*9880d681SAndroid Build Coastguard Workerbody:
884*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i16* [ %gep3, %body ], [ %gep1, %entry ]
885*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
886*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i16, i16* %iv2, i64 -1
887*9880d681SAndroid Build Coastguard Worker  %load = load i16, i16* %gep2
888*9880d681SAndroid Build Coastguard Worker  call void @use-halfword(i16 %load)
889*9880d681SAndroid Build Coastguard Worker  store i16 %val, i16* %iv2
890*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
891*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i16, i16* %iv2, i64 4
892*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
893*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
894*9880d681SAndroid Build Coastguard Worker
895*9880d681SAndroid Build Coastguard Workerexit:
896*9880d681SAndroid Build Coastguard Worker  ret void
897*9880d681SAndroid Build Coastguard Worker}
898*9880d681SAndroid Build Coastguard Worker
899*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-word(i32* %array, i64 %count, i32 %val) nounwind {
900*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-word
901*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}], #16
902*9880d681SAndroid Build Coastguard Workerentry:
903*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32* %array, i64 2
904*9880d681SAndroid Build Coastguard Worker  br label %body
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Workerbody:
907*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i32* [ %gep3, %body ], [ %gep1, %entry ]
908*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
909*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i32, i32* %iv2, i64 -1
910*9880d681SAndroid Build Coastguard Worker  %load = load i32, i32* %gep2
911*9880d681SAndroid Build Coastguard Worker  call void @use-word(i32 %load)
912*9880d681SAndroid Build Coastguard Worker  store i32 %val, i32* %iv2
913*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
914*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i32, i32* %iv2, i64 4
915*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
916*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
917*9880d681SAndroid Build Coastguard Worker
918*9880d681SAndroid Build Coastguard Workerexit:
919*9880d681SAndroid Build Coastguard Worker  ret void
920*9880d681SAndroid Build Coastguard Worker}
921*9880d681SAndroid Build Coastguard Worker
922*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-doubleword(i64* %array, i64 %count, i64 %val) nounwind {
923*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-doubleword
924*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}], #32
925*9880d681SAndroid Build Coastguard Workerentry:
926*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i64, i64* %array, i64 2
927*9880d681SAndroid Build Coastguard Worker  br label %body
928*9880d681SAndroid Build Coastguard Worker
929*9880d681SAndroid Build Coastguard Workerbody:
930*9880d681SAndroid Build Coastguard Worker  %iv2 = phi i64* [ %gep3, %body ], [ %gep1, %entry ]
931*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
932*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i64, i64* %iv2, i64 -1
933*9880d681SAndroid Build Coastguard Worker  %load = load i64, i64* %gep2
934*9880d681SAndroid Build Coastguard Worker  call void @use-doubleword(i64 %load)
935*9880d681SAndroid Build Coastguard Worker  store i64 %val, i64* %iv2
936*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
937*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i64, i64* %iv2, i64 4
938*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
939*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
940*9880d681SAndroid Build Coastguard Worker
941*9880d681SAndroid Build Coastguard Workerexit:
942*9880d681SAndroid Build Coastguard Worker  ret void
943*9880d681SAndroid Build Coastguard Worker}
944*9880d681SAndroid Build Coastguard Worker
945*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-quadword(<2 x i64>* %array, i64 %count, <2 x i64> %val) nounwind {
946*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-quadword
947*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}], #64
948*9880d681SAndroid Build Coastguard Workerentry:
949*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr <2 x i64>, <2 x i64>* %array, i64 2
950*9880d681SAndroid Build Coastguard Worker  br label %body
951*9880d681SAndroid Build Coastguard Worker
952*9880d681SAndroid Build Coastguard Workerbody:
953*9880d681SAndroid Build Coastguard Worker  %iv2 = phi <2 x i64>* [ %gep3, %body ], [ %gep1, %entry ]
954*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
955*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 -1
956*9880d681SAndroid Build Coastguard Worker  %load = load <2 x i64>, <2 x i64>* %gep2
957*9880d681SAndroid Build Coastguard Worker  call void @use-quadword(<2 x i64> %load)
958*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %val, <2 x i64>* %iv2
959*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
960*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr <2 x i64>, <2 x i64>* %iv2, i64 4
961*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
962*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
963*9880d681SAndroid Build Coastguard Worker
964*9880d681SAndroid Build Coastguard Workerexit:
965*9880d681SAndroid Build Coastguard Worker  ret void
966*9880d681SAndroid Build Coastguard Worker}
967*9880d681SAndroid Build Coastguard Worker
968*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-float(float* %array, i64 %count, float %val) nounwind {
969*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-float
970*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}], #16
971*9880d681SAndroid Build Coastguard Workerentry:
972*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr float, float* %array, i64 2
973*9880d681SAndroid Build Coastguard Worker  br label %body
974*9880d681SAndroid Build Coastguard Worker
975*9880d681SAndroid Build Coastguard Workerbody:
976*9880d681SAndroid Build Coastguard Worker  %iv2 = phi float* [ %gep3, %body ], [ %gep1, %entry ]
977*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
978*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr float, float* %iv2, i64 -1
979*9880d681SAndroid Build Coastguard Worker  %load = load float, float* %gep2
980*9880d681SAndroid Build Coastguard Worker  call void @use-float(float %load)
981*9880d681SAndroid Build Coastguard Worker  store float %val, float* %iv2
982*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
983*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr float, float* %iv2, i64 4
984*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
985*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
986*9880d681SAndroid Build Coastguard Worker
987*9880d681SAndroid Build Coastguard Workerexit:
988*9880d681SAndroid Build Coastguard Worker  ret void
989*9880d681SAndroid Build Coastguard Worker}
990*9880d681SAndroid Build Coastguard Worker
991*9880d681SAndroid Build Coastguard Workerdefine void @store-post-indexed-double(double* %array, i64 %count, double %val) nounwind {
992*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-post-indexed-double
993*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}], #32
994*9880d681SAndroid Build Coastguard Workerentry:
995*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr double, double* %array, i64 2
996*9880d681SAndroid Build Coastguard Worker  br label %body
997*9880d681SAndroid Build Coastguard Worker
998*9880d681SAndroid Build Coastguard Workerbody:
999*9880d681SAndroid Build Coastguard Worker  %iv2 = phi double* [ %gep3, %body ], [ %gep1, %entry ]
1000*9880d681SAndroid Build Coastguard Worker  %iv = phi i64 [ %iv.next, %body ], [ %count, %entry ]
1001*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr double, double* %iv2, i64 -1
1002*9880d681SAndroid Build Coastguard Worker  %load = load double, double* %gep2
1003*9880d681SAndroid Build Coastguard Worker  call void @use-double(double %load)
1004*9880d681SAndroid Build Coastguard Worker  store double %val, double* %iv2
1005*9880d681SAndroid Build Coastguard Worker  %iv.next = add i64 %iv, -4
1006*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr double, double* %iv2, i64 4
1007*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i64 %iv.next, 0
1008*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %exit, label %body
1009*9880d681SAndroid Build Coastguard Worker
1010*9880d681SAndroid Build Coastguard Workerexit:
1011*9880d681SAndroid Build Coastguard Worker  ret void
1012*9880d681SAndroid Build Coastguard Worker}
1013*9880d681SAndroid Build Coastguard Worker
1014*9880d681SAndroid Build Coastguard Workerdeclare void @use-byte(i8)
1015*9880d681SAndroid Build Coastguard Workerdeclare void @use-halfword(i16)
1016*9880d681SAndroid Build Coastguard Workerdeclare void @use-word(i32)
1017*9880d681SAndroid Build Coastguard Workerdeclare void @use-doubleword(i64)
1018*9880d681SAndroid Build Coastguard Workerdeclare void @use-quadword(<2 x i64>)
1019*9880d681SAndroid Build Coastguard Workerdeclare void @use-float(float)
1020*9880d681SAndroid Build Coastguard Workerdeclare void @use-double(double)
1021*9880d681SAndroid Build Coastguard Worker
1022*9880d681SAndroid Build Coastguard Worker; Check the following transform:
1023*9880d681SAndroid Build Coastguard Worker;
1024*9880d681SAndroid Build Coastguard Worker; stp w0, [x20]
1025*9880d681SAndroid Build Coastguard Worker;  ...
1026*9880d681SAndroid Build Coastguard Worker; add x20, x20, #32
1027*9880d681SAndroid Build Coastguard Worker;  ->
1028*9880d681SAndroid Build Coastguard Worker; stp w0, [x20], #32
1029*9880d681SAndroid Build Coastguard Worker
1030*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-word() nounwind {
1031*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-word
1032*9880d681SAndroid Build Coastguard Worker; CHECK: stp w{{[0-9]+}}, w{{[0-9]+}}, [sp], #16
1033*9880d681SAndroid Build Coastguard Worker; CHECK: ret
1034*9880d681SAndroid Build Coastguard Worker  %src = alloca { i32, i32 }, align 8
1035*9880d681SAndroid Build Coastguard Worker  %dst = alloca { i32, i32 }, align 8
1036*9880d681SAndroid Build Coastguard Worker
1037*9880d681SAndroid Build Coastguard Worker  %src.realp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %src, i32 0, i32 0
1038*9880d681SAndroid Build Coastguard Worker  %src.real = load i32, i32* %src.realp
1039*9880d681SAndroid Build Coastguard Worker  %src.imagp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %src, i32 0, i32 1
1040*9880d681SAndroid Build Coastguard Worker  %src.imag = load i32, i32* %src.imagp
1041*9880d681SAndroid Build Coastguard Worker
1042*9880d681SAndroid Build Coastguard Worker  %dst.realp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %dst, i32 0, i32 0
1043*9880d681SAndroid Build Coastguard Worker  %dst.imagp = getelementptr inbounds { i32, i32 }, { i32, i32 }* %dst, i32 0, i32 1
1044*9880d681SAndroid Build Coastguard Worker  store i32 %src.real, i32* %dst.realp
1045*9880d681SAndroid Build Coastguard Worker  store i32 %src.imag, i32* %dst.imagp
1046*9880d681SAndroid Build Coastguard Worker  ret void
1047*9880d681SAndroid Build Coastguard Worker}
1048*9880d681SAndroid Build Coastguard Worker
1049*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-doubleword() nounwind {
1050*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-doubleword
1051*9880d681SAndroid Build Coastguard Worker; CHECK: stp x{{[0-9]+}}, x{{[0-9]+}}, [sp], #32
1052*9880d681SAndroid Build Coastguard Worker; CHECK: ret
1053*9880d681SAndroid Build Coastguard Worker  %src = alloca { i64, i64 }, align 8
1054*9880d681SAndroid Build Coastguard Worker  %dst = alloca { i64, i64 }, align 8
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Worker  %src.realp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %src, i32 0, i32 0
1057*9880d681SAndroid Build Coastguard Worker  %src.real = load i64, i64* %src.realp
1058*9880d681SAndroid Build Coastguard Worker  %src.imagp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %src, i32 0, i32 1
1059*9880d681SAndroid Build Coastguard Worker  %src.imag = load i64, i64* %src.imagp
1060*9880d681SAndroid Build Coastguard Worker
1061*9880d681SAndroid Build Coastguard Worker  %dst.realp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %dst, i32 0, i32 0
1062*9880d681SAndroid Build Coastguard Worker  %dst.imagp = getelementptr inbounds { i64, i64 }, { i64, i64 }* %dst, i32 0, i32 1
1063*9880d681SAndroid Build Coastguard Worker  store i64 %src.real, i64* %dst.realp
1064*9880d681SAndroid Build Coastguard Worker  store i64 %src.imag, i64* %dst.imagp
1065*9880d681SAndroid Build Coastguard Worker  ret void
1066*9880d681SAndroid Build Coastguard Worker}
1067*9880d681SAndroid Build Coastguard Worker
1068*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-float() nounwind {
1069*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-float
1070*9880d681SAndroid Build Coastguard Worker; CHECK: stp s{{[0-9]+}}, s{{[0-9]+}}, [sp], #16
1071*9880d681SAndroid Build Coastguard Worker; CHECK: ret
1072*9880d681SAndroid Build Coastguard Worker  %src = alloca { float, float }, align 8
1073*9880d681SAndroid Build Coastguard Worker  %dst = alloca { float, float }, align 8
1074*9880d681SAndroid Build Coastguard Worker
1075*9880d681SAndroid Build Coastguard Worker  %src.realp = getelementptr inbounds { float, float }, { float, float }* %src, i32 0, i32 0
1076*9880d681SAndroid Build Coastguard Worker  %src.real = load float, float* %src.realp
1077*9880d681SAndroid Build Coastguard Worker  %src.imagp = getelementptr inbounds { float, float }, { float, float }* %src, i32 0, i32 1
1078*9880d681SAndroid Build Coastguard Worker  %src.imag = load float, float* %src.imagp
1079*9880d681SAndroid Build Coastguard Worker
1080*9880d681SAndroid Build Coastguard Worker  %dst.realp = getelementptr inbounds { float, float }, { float, float }* %dst, i32 0, i32 0
1081*9880d681SAndroid Build Coastguard Worker  %dst.imagp = getelementptr inbounds { float, float }, { float, float }* %dst, i32 0, i32 1
1082*9880d681SAndroid Build Coastguard Worker  store float %src.real, float* %dst.realp
1083*9880d681SAndroid Build Coastguard Worker  store float %src.imag, float* %dst.imagp
1084*9880d681SAndroid Build Coastguard Worker  ret void
1085*9880d681SAndroid Build Coastguard Worker}
1086*9880d681SAndroid Build Coastguard Worker
1087*9880d681SAndroid Build Coastguard Workerdefine void @store-pair-post-indexed-double() nounwind {
1088*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store-pair-post-indexed-double
1089*9880d681SAndroid Build Coastguard Worker; CHECK: stp d{{[0-9]+}}, d{{[0-9]+}}, [sp], #32
1090*9880d681SAndroid Build Coastguard Worker; CHECK: ret
1091*9880d681SAndroid Build Coastguard Worker  %src = alloca { double, double }, align 8
1092*9880d681SAndroid Build Coastguard Worker  %dst = alloca { double, double }, align 8
1093*9880d681SAndroid Build Coastguard Worker
1094*9880d681SAndroid Build Coastguard Worker  %src.realp = getelementptr inbounds { double, double }, { double, double }* %src, i32 0, i32 0
1095*9880d681SAndroid Build Coastguard Worker  %src.real = load double, double* %src.realp
1096*9880d681SAndroid Build Coastguard Worker  %src.imagp = getelementptr inbounds { double, double }, { double, double }* %src, i32 0, i32 1
1097*9880d681SAndroid Build Coastguard Worker  %src.imag = load double, double* %src.imagp
1098*9880d681SAndroid Build Coastguard Worker
1099*9880d681SAndroid Build Coastguard Worker  %dst.realp = getelementptr inbounds { double, double }, { double, double }* %dst, i32 0, i32 0
1100*9880d681SAndroid Build Coastguard Worker  %dst.imagp = getelementptr inbounds { double, double }, { double, double }* %dst, i32 0, i32 1
1101*9880d681SAndroid Build Coastguard Worker  store double %src.real, double* %dst.realp
1102*9880d681SAndroid Build Coastguard Worker  store double %src.imag, double* %dst.imagp
1103*9880d681SAndroid Build Coastguard Worker  ret void
1104*9880d681SAndroid Build Coastguard Worker}
1105*9880d681SAndroid Build Coastguard Worker
1106*9880d681SAndroid Build Coastguard Worker; Check the following transform:
1107*9880d681SAndroid Build Coastguard Worker;
1108*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x20]
1109*9880d681SAndroid Build Coastguard Worker;  ...
1110*9880d681SAndroid Build Coastguard Worker; sub x20, x20, #16
1111*9880d681SAndroid Build Coastguard Worker;  ->
1112*9880d681SAndroid Build Coastguard Worker; (ldr|str) X, [x20], #-16
1113*9880d681SAndroid Build Coastguard Worker;
1114*9880d681SAndroid Build Coastguard Worker; with X being either w0, x0, s0, d0 or q0.
1115*9880d681SAndroid Build Coastguard Worker
1116*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-word(i32* %a, i32* %b, i64 %count) nounwind {
1117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-word
1118*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w{{[0-9]+}}, [x{{[0-9]+}}], #-8
1119*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9]+}}, [x{{[0-9]+}}], #-8
1120*9880d681SAndroid Build Coastguard Worker  br label %for.body
1121*9880d681SAndroid Build Coastguard Workerfor.body:
1122*9880d681SAndroid Build Coastguard Worker  %phi1 = phi i32* [ %gep4, %for.body ], [ %b, %0 ]
1123*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i32* [ %gep3, %for.body ], [ %a, %0 ]
1124*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ]
1125*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32* %phi1, i64 -1
1126*9880d681SAndroid Build Coastguard Worker  %load1 = load i32, i32* %gep1
1127*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i32, i32* %phi2, i64 -1
1128*9880d681SAndroid Build Coastguard Worker  store i32 %load1, i32* %gep2
1129*9880d681SAndroid Build Coastguard Worker  %load2 = load i32, i32* %phi1
1130*9880d681SAndroid Build Coastguard Worker  store i32 %load2, i32* %phi2
1131*9880d681SAndroid Build Coastguard Worker  %dec.i = add nsw i64 %i, -1
1132*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i32, i32* %phi2, i64 -2
1133*9880d681SAndroid Build Coastguard Worker  %gep4 = getelementptr i32, i32* %phi1, i64 -2
1134*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i64 %dec.i, 0
1135*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %for.body, label %end
1136*9880d681SAndroid Build Coastguard Workerend:
1137*9880d681SAndroid Build Coastguard Worker  ret void
1138*9880d681SAndroid Build Coastguard Worker}
1139*9880d681SAndroid Build Coastguard Worker
1140*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-doubleword(i64* %a, i64* %b, i64 %count) nounwind {
1141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-doubleword
1142*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x{{[0-9]+}}, [x{{[0-9]+}}], #-16
1143*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}], #-16
1144*9880d681SAndroid Build Coastguard Worker  br label %for.body
1145*9880d681SAndroid Build Coastguard Workerfor.body:
1146*9880d681SAndroid Build Coastguard Worker  %phi1 = phi i64* [ %gep4, %for.body ], [ %b, %0 ]
1147*9880d681SAndroid Build Coastguard Worker  %phi2 = phi i64* [ %gep3, %for.body ], [ %a, %0 ]
1148*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ]
1149*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i64, i64* %phi1, i64 -1
1150*9880d681SAndroid Build Coastguard Worker  %load1 = load i64, i64* %gep1
1151*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i64, i64* %phi2, i64 -1
1152*9880d681SAndroid Build Coastguard Worker  store i64 %load1, i64* %gep2
1153*9880d681SAndroid Build Coastguard Worker  %load2 = load i64, i64* %phi1
1154*9880d681SAndroid Build Coastguard Worker  store i64 %load2, i64* %phi2
1155*9880d681SAndroid Build Coastguard Worker  %dec.i = add nsw i64 %i, -1
1156*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr i64, i64* %phi2, i64 -2
1157*9880d681SAndroid Build Coastguard Worker  %gep4 = getelementptr i64, i64* %phi1, i64 -2
1158*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i64 %dec.i, 0
1159*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %for.body, label %end
1160*9880d681SAndroid Build Coastguard Workerend:
1161*9880d681SAndroid Build Coastguard Worker  ret void
1162*9880d681SAndroid Build Coastguard Worker}
1163*9880d681SAndroid Build Coastguard Worker
1164*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-quadword(<2 x i64>* %a, <2 x i64>* %b, i64 %count) nounwind {
1165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-quadword
1166*9880d681SAndroid Build Coastguard Worker; CHECK: ldr q{{[0-9]+}}, [x{{[0-9]+}}], #-32
1167*9880d681SAndroid Build Coastguard Worker; CHECK: str q{{[0-9]+}}, [x{{[0-9]+}}], #-32
1168*9880d681SAndroid Build Coastguard Worker  br label %for.body
1169*9880d681SAndroid Build Coastguard Workerfor.body:
1170*9880d681SAndroid Build Coastguard Worker  %phi1 = phi <2 x i64>* [ %gep4, %for.body ], [ %b, %0 ]
1171*9880d681SAndroid Build Coastguard Worker  %phi2 = phi <2 x i64>* [ %gep3, %for.body ], [ %a, %0 ]
1172*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ]
1173*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr <2 x i64>, <2 x i64>* %phi1, i64 -1
1174*9880d681SAndroid Build Coastguard Worker  %load1 = load <2 x i64>, <2 x i64>* %gep1
1175*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr <2 x i64>, <2 x i64>* %phi2, i64 -1
1176*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %load1, <2 x i64>* %gep2
1177*9880d681SAndroid Build Coastguard Worker  %load2 = load <2 x i64>, <2 x i64>* %phi1
1178*9880d681SAndroid Build Coastguard Worker  store <2 x i64> %load2, <2 x i64>* %phi2
1179*9880d681SAndroid Build Coastguard Worker  %dec.i = add nsw i64 %i, -1
1180*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr <2 x i64>, <2 x i64>* %phi2, i64 -2
1181*9880d681SAndroid Build Coastguard Worker  %gep4 = getelementptr <2 x i64>, <2 x i64>* %phi1, i64 -2
1182*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i64 %dec.i, 0
1183*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %for.body, label %end
1184*9880d681SAndroid Build Coastguard Workerend:
1185*9880d681SAndroid Build Coastguard Worker  ret void
1186*9880d681SAndroid Build Coastguard Worker}
1187*9880d681SAndroid Build Coastguard Worker
1188*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-float(float* %a, float* %b, i64 %count) nounwind {
1189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-float
1190*9880d681SAndroid Build Coastguard Worker; CHECK: ldr s{{[0-9]+}}, [x{{[0-9]+}}], #-8
1191*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9]+}}, [x{{[0-9]+}}], #-8
1192*9880d681SAndroid Build Coastguard Worker  br label %for.body
1193*9880d681SAndroid Build Coastguard Workerfor.body:
1194*9880d681SAndroid Build Coastguard Worker  %phi1 = phi float* [ %gep4, %for.body ], [ %b, %0 ]
1195*9880d681SAndroid Build Coastguard Worker  %phi2 = phi float* [ %gep3, %for.body ], [ %a, %0 ]
1196*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ]
1197*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr float, float* %phi1, i64 -1
1198*9880d681SAndroid Build Coastguard Worker  %load1 = load float, float* %gep1
1199*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr float, float* %phi2, i64 -1
1200*9880d681SAndroid Build Coastguard Worker  store float %load1, float* %gep2
1201*9880d681SAndroid Build Coastguard Worker  %load2 = load float, float* %phi1
1202*9880d681SAndroid Build Coastguard Worker  store float %load2, float* %phi2
1203*9880d681SAndroid Build Coastguard Worker  %dec.i = add nsw i64 %i, -1
1204*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr float, float* %phi2, i64 -2
1205*9880d681SAndroid Build Coastguard Worker  %gep4 = getelementptr float, float* %phi1, i64 -2
1206*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i64 %dec.i, 0
1207*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %for.body, label %end
1208*9880d681SAndroid Build Coastguard Workerend:
1209*9880d681SAndroid Build Coastguard Worker  ret void
1210*9880d681SAndroid Build Coastguard Worker}
1211*9880d681SAndroid Build Coastguard Worker
1212*9880d681SAndroid Build Coastguard Workerdefine void @post-indexed-sub-double(double* %a, double* %b, i64 %count) nounwind {
1213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: post-indexed-sub-double
1214*9880d681SAndroid Build Coastguard Worker; CHECK: ldr d{{[0-9]+}}, [x{{[0-9]+}}], #-16
1215*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9]+}}, [x{{[0-9]+}}], #-16
1216*9880d681SAndroid Build Coastguard Worker  br label %for.body
1217*9880d681SAndroid Build Coastguard Workerfor.body:
1218*9880d681SAndroid Build Coastguard Worker  %phi1 = phi double* [ %gep4, %for.body ], [ %b, %0 ]
1219*9880d681SAndroid Build Coastguard Worker  %phi2 = phi double* [ %gep3, %for.body ], [ %a, %0 ]
1220*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %dec.i, %for.body], [ %count, %0 ]
1221*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr double, double* %phi1, i64 -1
1222*9880d681SAndroid Build Coastguard Worker  %load1 = load double, double* %gep1
1223*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr double, double* %phi2, i64 -1
1224*9880d681SAndroid Build Coastguard Worker  store double %load1, double* %gep2
1225*9880d681SAndroid Build Coastguard Worker  %load2 = load double, double* %phi1
1226*9880d681SAndroid Build Coastguard Worker  store double %load2, double* %phi2
1227*9880d681SAndroid Build Coastguard Worker  %dec.i = add nsw i64 %i, -1
1228*9880d681SAndroid Build Coastguard Worker  %gep3 = getelementptr double, double* %phi2, i64 -2
1229*9880d681SAndroid Build Coastguard Worker  %gep4 = getelementptr double, double* %phi1, i64 -2
1230*9880d681SAndroid Build Coastguard Worker  %cond = icmp sgt i64 %dec.i, 0
1231*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %for.body, label %end
1232*9880d681SAndroid Build Coastguard Workerend:
1233*9880d681SAndroid Build Coastguard Worker  ret void
1234*9880d681SAndroid Build Coastguard Worker}
1235