xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/frame-15.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test the handling of base + index + 12-bit displacement addresses for
2*9880d681SAndroid Build Coastguard Worker; large frames, in cases where no 20-bit form exists.  The tests here
3*9880d681SAndroid Build Coastguard Worker; assume z10 register 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 Workerdeclare void @foo(float *%ptr1, float *%ptr2)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; This file tests what happens when a displacement is converted from
13*9880d681SAndroid Build Coastguard Worker; being relative to the start of a frame object to being relative to
14*9880d681SAndroid Build Coastguard Worker; the frame itself.  In some cases the test is only possible if two
15*9880d681SAndroid Build Coastguard Worker; objects are allocated.
16*9880d681SAndroid Build Coastguard Worker;
17*9880d681SAndroid Build Coastguard Worker; Rather than rely on a particular order for those objects, the tests
18*9880d681SAndroid Build Coastguard Worker; instead allocate two objects of the same size and apply the test to
19*9880d681SAndroid Build Coastguard Worker; both of them.  For consistency, all tests follow this model, even if
20*9880d681SAndroid Build Coastguard Worker; one object would actually be enough.
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; First check the highest in-range offset after conversion, which is 4092
23*9880d681SAndroid Build Coastguard Worker; for word-addressing instructions like LDEB.
24*9880d681SAndroid Build Coastguard Worker;
25*9880d681SAndroid Build Coastguard Worker; The last in-range doubleword offset is 4088.  Since the frame has two
26*9880d681SAndroid Build Coastguard Worker; emergency spill slots at 160(%r15), the amount that we need to allocate
27*9880d681SAndroid Build Coastguard Worker; in order to put another object at offset 4088 is (4088 - 176) / 4 = 978
28*9880d681SAndroid Build Coastguard Worker; words.
29*9880d681SAndroid Build Coastguard Workerdefine void @f1(double *%dst) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f1:
31*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r15)
32*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f1:
35*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r11)
36*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
37*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x float], align 8
38*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x float], align 8
39*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0
40*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0
41*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
42*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 1
43*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 1
44*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
45*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
46*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
47*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
48*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
49*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
50*9880d681SAndroid Build Coastguard Worker  ret void
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker; Test the first out-of-range offset.
54*9880d681SAndroid Build Coastguard Workerdefine void @f2(double *%dst) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f2:
56*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096
57*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1,%r15)
58*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
59*9880d681SAndroid Build Coastguard Worker;
60*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f2:
61*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096
62*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1,%r11)
63*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
64*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x float], align 8
65*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x float], align 8
66*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0
67*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0
68*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
69*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2
70*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2
71*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
72*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
73*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
74*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
75*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
76*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
77*9880d681SAndroid Build Coastguard Worker  ret void
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; Test the next offset after that.
81*9880d681SAndroid Build Coastguard Workerdefine void @f3(double *%dst) {
82*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f3:
83*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096
84*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15)
85*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
86*9880d681SAndroid Build Coastguard Worker;
87*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f3:
88*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096
89*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11)
90*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
91*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x float], align 8
92*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x float], align 8
93*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0
94*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0
95*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
96*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 3
97*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 3
98*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
99*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
100*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
101*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
102*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
103*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
104*9880d681SAndroid Build Coastguard Worker  ret void
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker; Add 4096 bytes (1024 words) to the size of each object and repeat.
108*9880d681SAndroid Build Coastguard Workerdefine void @f4(double *%dst) {
109*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f4:
110*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 4096
111*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r1,%r15)
112*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
113*9880d681SAndroid Build Coastguard Worker;
114*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f4:
115*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 4096
116*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r1,%r11)
117*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
118*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x float], align 8
119*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x float], align 8
120*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0
121*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0
122*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
123*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 1
124*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 1
125*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
126*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
127*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
128*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
129*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
130*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
131*9880d681SAndroid Build Coastguard Worker  ret void
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; ...as above.
135*9880d681SAndroid Build Coastguard Workerdefine void @f5(double *%dst) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f5:
137*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192
138*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1,%r15)
139*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
140*9880d681SAndroid Build Coastguard Worker;
141*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f5:
142*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192
143*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1,%r11)
144*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
145*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x float], align 8
146*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x float], align 8
147*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0
148*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0
149*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
150*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 2
151*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 2
152*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
153*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
154*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
155*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
156*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
157*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
158*9880d681SAndroid Build Coastguard Worker  ret void
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker; ...as above.
162*9880d681SAndroid Build Coastguard Workerdefine void @f6(double *%dst) {
163*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f6:
164*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192
165*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15)
166*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
167*9880d681SAndroid Build Coastguard Worker;
168*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f6:
169*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192
170*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11)
171*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
172*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2002 x float], align 8
173*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2002 x float], align 8
174*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 0
175*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 0
176*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
177*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2002 x float], [2002 x float]* %region1, i64 0, i64 3
178*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2002 x float], [2002 x float]* %region2, i64 0, i64 3
179*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
180*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
181*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
182*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
183*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
184*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; Now try an offset of 4092 from the start of the object, with the object
189*9880d681SAndroid Build Coastguard Worker; being at offset 8192.  This time we need objects of (8192 - 168) / 4 = 2004
190*9880d681SAndroid Build Coastguard Worker; words.
191*9880d681SAndroid Build Coastguard Workerdefine void @f7(double *%dst) {
192*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f7:
193*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 8192
194*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4092(%r1,%r15)
195*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
196*9880d681SAndroid Build Coastguard Worker;
197*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f7:
198*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 8192
199*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4092(%r1,%r11)
200*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
201*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2004 x float], align 8
202*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2004 x float], align 8
203*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2004 x float], [2004 x float]* %region1, i64 0, i64 0
204*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2004 x float], [2004 x float]* %region2, i64 0, i64 0
205*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
206*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2004 x float], [2004 x float]* %region1, i64 0, i64 1023
207*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2004 x float], [2004 x float]* %region2, i64 0, i64 1023
208*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
209*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
210*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
211*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
212*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
213*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
214*9880d681SAndroid Build Coastguard Worker  ret void
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; Keep the object-relative offset the same but bump the size of the
218*9880d681SAndroid Build Coastguard Worker; objects by one doubleword.
219*9880d681SAndroid Build Coastguard Workerdefine void @f8(double *%dst) {
220*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f8:
221*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi %r1, 12288
222*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 4(%r1,%r15)
223*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
224*9880d681SAndroid Build Coastguard Worker;
225*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f8:
226*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi %r1, 12288
227*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 4(%r1,%r11)
228*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
229*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2006 x float], align 8
230*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2006 x float], align 8
231*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 0
232*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 0
233*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
234*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 1023
235*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 1023
236*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
237*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
238*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
239*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
240*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
241*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
242*9880d681SAndroid Build Coastguard Worker  ret void
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker; Check a case where the original displacement is out of range.  The backend
246*9880d681SAndroid Build Coastguard Worker; should force an LAY from the outset.  We don't yet do any kind of anchor
247*9880d681SAndroid Build Coastguard Worker; optimization, so there should be no offset on the LDEB itself.
248*9880d681SAndroid Build Coastguard Workerdefine void @f9(double *%dst) {
249*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f9:
250*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 12296(%r15)
251*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0(%r1)
252*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
253*9880d681SAndroid Build Coastguard Worker;
254*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f9:
255*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 12296(%r11)
256*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0(%r1)
257*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
258*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [2006 x float], align 8
259*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [2006 x float], align 8
260*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 0
261*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 0
262*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
263*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [2006 x float], [2006 x float]* %region1, i64 0, i64 1024
264*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [2006 x float], [2006 x float]* %region2, i64 0, i64 1024
265*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
266*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
267*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
268*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
269*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
270*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
271*9880d681SAndroid Build Coastguard Worker  ret void
272*9880d681SAndroid Build Coastguard Worker}
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker; Repeat f2 in a case that needs the emergency spill slots, because all
275*9880d681SAndroid Build Coastguard Worker; call-clobbered and allocated call-saved registers are live.  Note that
276*9880d681SAndroid Build Coastguard Worker; %vptr and %dst are copied to call-saved registers, freeing up %r2 and
277*9880d681SAndroid Build Coastguard Worker; %r3 during the main test.
278*9880d681SAndroid Build Coastguard Workerdefine void @f10(i32 *%vptr, double *%dst) {
279*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f10:
280*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r15)
281*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lghi [[REGISTER]], 4096
282*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r15)
283*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lg [[REGISTER]], [[OFFSET]](%r15)
284*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
285*9880d681SAndroid Build Coastguard Worker;
286*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f10:
287*9880d681SAndroid Build Coastguard Worker; CHECK-FP: stg [[REGISTER:%r[1-9][0-4]?]], [[OFFSET:160|168]](%r11)
288*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lghi [[REGISTER]], 4096
289*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r11)
290*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lg [[REGISTER]], [[OFFSET]](%r11)
291*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
292*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x float], align 8
293*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x float], align 8
294*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0
295*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0
296*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
297*9880d681SAndroid Build Coastguard Worker  %ptr1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2
298*9880d681SAndroid Build Coastguard Worker  %ptr2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2
299*9880d681SAndroid Build Coastguard Worker  %i0 = load volatile i32 , i32 *%vptr
300*9880d681SAndroid Build Coastguard Worker  %i1 = load volatile i32 , i32 *%vptr
301*9880d681SAndroid Build Coastguard Worker  %i2 = load volatile i32 , i32 *%vptr
302*9880d681SAndroid Build Coastguard Worker  %i3 = load volatile i32 , i32 *%vptr
303*9880d681SAndroid Build Coastguard Worker  %i4 = load volatile i32 , i32 *%vptr
304*9880d681SAndroid Build Coastguard Worker  %i5 = load volatile i32 , i32 *%vptr
305*9880d681SAndroid Build Coastguard Worker  %i14 = load volatile i32 , i32 *%vptr
306*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
307*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
308*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
309*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
310*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
311*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
312*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i0, i32 *%vptr
313*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i1, i32 *%vptr
314*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i2, i32 *%vptr
315*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i3, i32 *%vptr
316*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i4, i32 *%vptr
317*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i5, i32 *%vptr
318*9880d681SAndroid Build Coastguard Worker  store volatile i32 %i14, i32 *%vptr
319*9880d681SAndroid Build Coastguard Worker  ret void
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker; Repeat f2 in a case where the index register is already occupied.
323*9880d681SAndroid Build Coastguard Workerdefine void @f11(double *%dst, i64 %index) {
324*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP-LABEL: f11:
325*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lgr [[REGISTER:%r[1-9][0-5]?]], %r3
326*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: lay %r1, 4096(%r15)
327*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r1)
328*9880d681SAndroid Build Coastguard Worker; CHECK-NOFP: br %r14
329*9880d681SAndroid Build Coastguard Worker;
330*9880d681SAndroid Build Coastguard Worker; CHECK-FP-LABEL: f11:
331*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lgr [[REGISTER:%r[1-9][0-5]?]], %r3
332*9880d681SAndroid Build Coastguard Worker; CHECK-FP: lay %r1, 4096(%r11)
333*9880d681SAndroid Build Coastguard Worker; CHECK-FP: ldeb {{%f[0-7]}}, 0([[REGISTER]],%r1)
334*9880d681SAndroid Build Coastguard Worker; CHECK-FP: br %r14
335*9880d681SAndroid Build Coastguard Worker  %region1 = alloca [978 x float], align 8
336*9880d681SAndroid Build Coastguard Worker  %region2 = alloca [978 x float], align 8
337*9880d681SAndroid Build Coastguard Worker  %start1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 0
338*9880d681SAndroid Build Coastguard Worker  %start2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 0
339*9880d681SAndroid Build Coastguard Worker  call void @foo(float *%start1, float *%start2)
340*9880d681SAndroid Build Coastguard Worker  %elem1 = getelementptr inbounds [978 x float], [978 x float]* %region1, i64 0, i64 2
341*9880d681SAndroid Build Coastguard Worker  %elem2 = getelementptr inbounds [978 x float], [978 x float]* %region2, i64 0, i64 2
342*9880d681SAndroid Build Coastguard Worker  %base1 = ptrtoint float *%elem1 to i64
343*9880d681SAndroid Build Coastguard Worker  %base2 = ptrtoint float *%elem2 to i64
344*9880d681SAndroid Build Coastguard Worker  %addr1 = add i64 %base1, %index
345*9880d681SAndroid Build Coastguard Worker  %addr2 = add i64 %base2, %index
346*9880d681SAndroid Build Coastguard Worker  %ptr1 = inttoptr i64 %addr1 to float *
347*9880d681SAndroid Build Coastguard Worker  %ptr2 = inttoptr i64 %addr2 to float *
348*9880d681SAndroid Build Coastguard Worker  %float1 = load float , float *%ptr1
349*9880d681SAndroid Build Coastguard Worker  %float2 = load float , float *%ptr2
350*9880d681SAndroid Build Coastguard Worker  %double1 = fpext float %float1 to double
351*9880d681SAndroid Build Coastguard Worker  %double2 = fpext float %float2 to double
352*9880d681SAndroid Build Coastguard Worker  store volatile double %double1, double *%dst
353*9880d681SAndroid Build Coastguard Worker  store volatile double %double2, double *%dst
354*9880d681SAndroid Build Coastguard Worker  ret void
355*9880d681SAndroid Build Coastguard Worker}
356