xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/frame-13.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test the handling of base + 12-bit displacement addresses for large frames,
2*9880d681SAndroid Build Coastguard Worker; in cases where no 20-bit form exists.  The tests here assume z10 register
3*9880d681SAndroid Build Coastguard Worker; pressure, without the high words being available.
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | \
6*9880d681SAndroid Build Coastguard Worker; RUN:   FileCheck -check-prefix=CHECK-NOFP %s
7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -disable-fp-elim | \
8*9880d681SAndroid Build Coastguard Worker; RUN:   FileCheck -check-prefix=CHECK-FP %s
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; This file tests what happens when a displacement is converted from
11*9880d681SAndroid Build Coastguard Worker; being relative to the start of a frame object to being relative to
12*9880d681SAndroid Build Coastguard Worker; the frame itself.  In some cases the test is only possible if two
13*9880d681SAndroid Build Coastguard Worker; objects are allocated.
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; Rather than rely on a particular order for those objects, the tests
16*9880d681SAndroid Build Coastguard Worker; instead allocate two objects of the same size and apply the test to
17*9880d681SAndroid Build Coastguard Worker; both of them.  For consistency, all tests follow this model, even if
18*9880d681SAndroid Build Coastguard Worker; one object would actually be enough.
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; First check the highest in-range offset after conversion, which is 4092
21*9880d681SAndroid Build Coastguard Worker; for word-addressing instructions like MVHI.
22*9880d681SAndroid Build Coastguard Worker;
23*9880d681SAndroid Build Coastguard Worker; The last in-range doubleword offset is 4088.  Since the frame has two
24*9880d681SAndroid Build Coastguard Worker; emergency spill slots at 160(%r15), the amount that we need to allocate
25*9880d681SAndroid Build Coastguard Worker; in order to put another object at offset 4088 is (4088 - 176) / 4 = 978
26*9880d681SAndroid Build Coastguard Worker; words.
27*9880d681SAndroid Build Coastguard Workerdefine void @f1() {
28*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f1:
29*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4092(%r15), 42
30*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
31*9880d681SAndroid Build Coastguard Worker;
32*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f1:
33*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4092(%r11), 42
34*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
35*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x i32], align 8
36*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x i32], align 8
37*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x i32], [978 x i32]* %region1, i64 0, i64 1
38*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x i32], [978 x i32]* %region2, i64 0, i64 1
39*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
40*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
41*9880d681SAndroid Build Coastguard Worker  ret void
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker; Test the first out-of-range offset.  We cannot use an index register here.
45*9880d681SAndroid Build Coastguard Workerdefine void @f2() {
46*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f2:
47*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 4096(%r15)
48*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 0(%r1), 42
49*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
50*9880d681SAndroid Build Coastguard Worker;
51*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f2:
52*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 4096(%r11)
53*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 0(%r1), 42
54*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
55*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x i32], align 8
56*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x i32], align 8
57*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x i32], [978 x i32]* %region1, i64 0, i64 2
58*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x i32], [978 x i32]* %region2, i64 0, i64 2
59*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
60*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Test the next offset after that.
65*9880d681SAndroid Build Coastguard Workerdefine void @f3() {
66*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f3:
67*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 4096(%r15)
68*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4(%r1), 42
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
70*9880d681SAndroid Build Coastguard Worker;
71*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f3:
72*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 4096(%r11)
73*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4(%r1), 42
74*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
75*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x i32], align 8
76*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x i32], align 8
77*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x i32], [978 x i32]* %region1, i64 0, i64 3
78*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x i32], [978 x i32]* %region2, i64 0, i64 3
79*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
80*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; Add 4096 bytes (1024 words) to the size of each object and repeat.
85*9880d681SAndroid Build Coastguard Workerdefine void @f4() {
86*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f4:
87*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 4096(%r15)
88*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4092(%r1), 42
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
90*9880d681SAndroid Build Coastguard Worker;
91*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f4:
92*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 4096(%r11)
93*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4092(%r1), 42
94*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
95*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x i32], align 8
96*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x i32], align 8
97*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region1, i64 0, i64 1
98*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region2, i64 0, i64 1
99*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
100*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
101*9880d681SAndroid Build Coastguard Worker  ret void
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; ...as above.
105*9880d681SAndroid Build Coastguard Workerdefine void @f5() {
106*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f5:
107*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 8192(%r15)
108*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 0(%r1), 42
109*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
110*9880d681SAndroid Build Coastguard Worker;
111*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f5:
112*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 8192(%r11)
113*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 0(%r1), 42
114*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
115*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x i32], align 8
116*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x i32], align 8
117*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region1, i64 0, i64 2
118*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region2, i64 0, i64 2
119*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
120*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
121*9880d681SAndroid Build Coastguard Worker  ret void
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; ...as above.
125*9880d681SAndroid Build Coastguard Workerdefine void @f6() {
126*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f6:
127*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 8192(%r15)
128*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4(%r1), 42
129*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
130*9880d681SAndroid Build Coastguard Worker;
131*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f6:
132*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 8192(%r11)
133*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4(%r1), 42
134*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
135*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x i32], align 8
136*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x i32], align 8
137*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region1, i64 0, i64 3
138*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x i32], [2002 x i32]* %region2, i64 0, i64 3
139*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
140*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; Now try an offset of 4092 from the start of the object, with the object
145*9880d681SAndroid Build Coastguard Worker; being at offset 8192.  This time we need objects of (8192 - 176) / 4 = 2004
146*9880d681SAndroid Build Coastguard Worker; words.
147*9880d681SAndroid Build Coastguard Workerdefine void @f7() {
148*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f7:
149*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 8192(%r15)
150*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4092(%r1), 42
151*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
152*9880d681SAndroid Build Coastguard Worker;
153*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f7:
154*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 8192(%r11)
155*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4092(%r1), 42
156*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
157*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2004 x i32], align 8
158*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2004 x i32], align 8
159*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2004 x i32], [2004 x i32]* %region1, i64 0, i64 1023
160*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2004 x i32], [2004 x i32]* %region2, i64 0, i64 1023
161*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
162*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; Keep the object-relative offset the same but bump the size of the
167*9880d681SAndroid Build Coastguard Worker; objects by one doubleword.
168*9880d681SAndroid Build Coastguard Workerdefine void @f8() {
169*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f8:
170*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 12288(%r15)
171*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 4(%r1), 42
172*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
173*9880d681SAndroid Build Coastguard Worker;
174*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f8:
175*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 12288(%r11)
176*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 4(%r1), 42
177*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
178*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2006 x i32], align 8
179*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2006 x i32], align 8
180*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2006 x i32], [2006 x i32]* %region1, i64 0, i64 1023
181*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2006 x i32], [2006 x i32]* %region2, i64 0, i64 1023
182*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
183*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
184*9880d681SAndroid Build Coastguard Worker  ret void
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; Check a case where the original displacement is out of range.  The backend
188*9880d681SAndroid Build Coastguard Worker; should force STY to be used instead.
189*9880d681SAndroid Build Coastguard Workerdefine void @f9() {
190*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f9:
191*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lhi [[TMP:%r[0-5]]], 42
192*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: sty [[TMP]], 12296(%r15)
193*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
194*9880d681SAndroid Build Coastguard Worker;
195*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f9:
196*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lhi [[TMP:%r[0-5]]], 42
197*9880d681SAndroid Build Coastguard Worker; CHECK-FP: sty [[TMP]], 12296(%r11)
198*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
199*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2006 x i32], align 8
200*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2006 x i32], align 8
201*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2006 x i32], [2006 x i32]* %region1, i64 0, i64 1024
202*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2006 x i32], [2006 x i32]* %region2, i64 0, i64 1024
203*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
204*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
205*9880d681SAndroid Build Coastguard Worker  ret void
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; Repeat f2 in a case that needs the emergency spill slots (because all
209*9880d681SAndroid Build Coastguard Worker; call-clobbered registers are live and no call-saved ones have been
210*9880d681SAndroid Build Coastguard Worker; allocated).
211*9880d681SAndroid Build Coastguard Workerdefine void @f10(i32 *%vptr) {
212*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f10:
213*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15)
214*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay [[REGISTER]], 4096(%r15)
215*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 0([[REGISTER]]), 42
216*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15)
217*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
218*9880d681SAndroid Build Coastguard Worker;
219*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f10:
220*9880d681SAndroid Build Coastguard Worker; CHECK-FP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r11)
221*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay [[REGISTER]], 4096(%r11)
222*9880d681SAndroid Build Coastguard Worker; CHECK-FP: mvhi 0([[REGISTER]]), 42
223*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lg [[REGISTER]], [[OFFSET]](%r11)
224*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
225*9880d681SAndroid Build Coastguard Worker  %i0 = load volatile i32 , i32 *%vptr
226*9880d681SAndroid Build Coastguard Worker  %i1 = load volatile i32 , i32 *%vptr
227*9880d681SAndroid Build Coastguard Worker  %i3 = load volatile i32 , i32 *%vptr
228*9880d681SAndroid Build Coastguard Worker  %i4 = load volatile i32 , i32 *%vptr
229*9880d681SAndroid Build Coastguard Worker  %i5 = load volatile i32 , i32 *%vptr
230*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x i32], align 8
231*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x i32], align 8
232*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x i32], [978 x i32]* %region1, i64 0, i64 2
233*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x i32], [978 x i32]* %region2, i64 0, i64 2
234*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
235*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
236*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i0, i32 *%vptr
237*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i1, i32 *%vptr
238*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i3, i32 *%vptr
239*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i4, i32 *%vptr
240*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i5, i32 *%vptr
241*9880d681SAndroid Build Coastguard Worker  ret void
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; And again with maximum register pressure.  The only spill slots that the
245*9880d681SAndroid Build Coastguard Worker; NOFP case needs are the emergency ones, so the offsets are the same as for f2.
246*9880d681SAndroid Build Coastguard Worker; The FP case needs to spill an extra register and is too dependent on
247*9880d681SAndroid Build Coastguard Worker; register allocation heuristics for a stable test.
248*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 *%vptr) {
249*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f11:
250*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: stmg %r6, %r15,
251*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15)
252*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay [[REGISTER]], 4096(%r15)
253*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: mvhi 0([[REGISTER]]), 42
254*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15)
255*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lmg %r6, %r15,
256*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
257*9880d681SAndroid Build Coastguard Worker  %i0 = load volatile i32 , i32 *%vptr
258*9880d681SAndroid Build Coastguard Worker  %i1 = load volatile i32 , i32 *%vptr
259*9880d681SAndroid Build Coastguard Worker  %i3 = load volatile i32 , i32 *%vptr
260*9880d681SAndroid Build Coastguard Worker  %i4 = load volatile i32 , i32 *%vptr
261*9880d681SAndroid Build Coastguard Worker  %i5 = load volatile i32 , i32 *%vptr
262*9880d681SAndroid Build Coastguard Worker  %i6 = load volatile i32 , i32 *%vptr
263*9880d681SAndroid Build Coastguard Worker  %i7 = load volatile i32 , i32 *%vptr
264*9880d681SAndroid Build Coastguard Worker  %i8 = load volatile i32 , i32 *%vptr
265*9880d681SAndroid Build Coastguard Worker  %i9 = load volatile i32 , i32 *%vptr
266*9880d681SAndroid Build Coastguard Worker  %i10 = load volatile i32 , i32 *%vptr
267*9880d681SAndroid Build Coastguard Worker  %i11 = load volatile i32 , i32 *%vptr
268*9880d681SAndroid Build Coastguard Worker  %i12 = load volatile i32 , i32 *%vptr
269*9880d681SAndroid Build Coastguard Worker  %i13 = load volatile i32 , i32 *%vptr
270*9880d681SAndroid Build Coastguard Worker  %i14 = load volatile i32 , i32 *%vptr
271*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x i32], align 8
272*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x i32], align 8
273*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x i32], [978 x i32]* %region1, i64 0, i64 2
274*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x i32], [978 x i32]* %region2, i64 0, i64 2
275*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr1
276*9880d681SAndroid Build Coastguard Worker  store volatile i32 42, i32 *%ptr2
277*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i0, i32 *%vptr
278*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i1, i32 *%vptr
279*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i3, i32 *%vptr
280*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i4, i32 *%vptr
281*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i5, i32 *%vptr
282*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i6, i32 *%vptr
283*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i7, i32 *%vptr
284*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i8, i32 *%vptr
285*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i9, i32 *%vptr
286*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i10, i32 *%vptr
287*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i11, i32 *%vptr
288*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i12, i32 *%vptr
289*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i13, i32 *%vptr
290*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i14, i32 *%vptr
291*9880d681SAndroid Build Coastguard Worker  ret void
292*9880d681SAndroid Build Coastguard Worker}
293