xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-collect-loh.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-apple-ios -O2 -aarch64-collect-loh -aarch64-collect-loh-bb-only=false < %s -o - | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -O2 -aarch64-collect-loh -aarch64-collect-loh-bb-only=false < %s -o - | FileCheck %s --check-prefix=CHECK-ELF
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: .loh
5*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpAdrp
6*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpAdd
7*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpLdrGot
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker@a = internal unnamed_addr global i32 0, align 4
10*9880d681SAndroid Build Coastguard Worker@b = external global i32
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; Function Attrs: noinline nounwind ssp
13*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %t) {
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @a, align 4
16*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp, %t
17*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* @a, align 4
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind ssp
22*9880d681SAndroid Build Coastguard Worker; Testcase for <rdar://problem/15438605>, AdrpAdrp reuse is valid only when the first adrp
23*9880d681SAndroid Build Coastguard Worker; dominates the second.
24*9880d681SAndroid Build Coastguard Worker; The first adrp comes from the loading of 'a' and the second the loading of 'b'.
25*9880d681SAndroid Build Coastguard Worker; 'a' is loaded in if.then, 'b' in if.end4, if.then does not dominates if.end4.
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _test
27*9880d681SAndroid Build Coastguard Worker; CHECK: ret
28*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .loh AdrpAdrp
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32 %t) {
30*9880d681SAndroid Build Coastguard Workerentry:
31*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %t, 5
32*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.end4
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerif.then:                                          ; preds = %entry
35*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @a, align 4
36*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp, %t
37*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i32 %add, 12
38*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %if.then2, label %if.end4
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerif.then2:                                         ; preds = %if.then
41*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %add)
42*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @a, align 4
43*9880d681SAndroid Build Coastguard Worker  br label %if.end4
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerif.end4:                                          ; preds = %if.then2, %if.then, %entry
46*9880d681SAndroid Build Coastguard Worker  %t.addr.0 = phi i32 [ %tmp1, %if.then2 ], [ %t, %if.then ], [ %t, %entry ]
47*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* @b, align 4
48*9880d681SAndroid Build Coastguard Worker  %add5 = add nsw i32 %tmp2, %t.addr.0
49*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i32 %add5)
50*9880d681SAndroid Build Coastguard Worker  %tmp3 = load i32, i32* @b, align 4
51*9880d681SAndroid Build Coastguard Worker  %add6 = add nsw i32 %tmp3, %t.addr.0
52*9880d681SAndroid Build Coastguard Worker  ret i32 %add6
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker@C = common global i32 0, align 4
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpLdrGotLdr case when we have a simple chain:
58*9880d681SAndroid Build Coastguard Worker; adrp -> ldrgot -> ldr.
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getC
60*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF]
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[LDRGOT_REG]]]
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
67*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
68*9880d681SAndroid Build Coastguard Workerdefine i32 @getC() {
69*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* @C, align 4
70*9880d681SAndroid Build Coastguard Worker  ret i32 %res
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal.
74*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtC
76*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF]
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[LDRGOT_REG]]]
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
83*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
84*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtC() {
85*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* @C, align 4
86*9880d681SAndroid Build Coastguard Worker  %sextres = sext i32 %res to i64
87*9880d681SAndroid Build Coastguard Worker  ret i64 %sextres
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is
91*9880d681SAndroid Build Coastguard Worker; used several times.
92*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot for those.
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralC
94*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF]
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[LDRGOT_REG]]]
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[LDRGOT_REG]]]
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
102*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]]
103*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralC(i32 %t) {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @C, align 4
106*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp, %t
107*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* @C, align 4
108*9880d681SAndroid Build Coastguard Worker  ret void
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Make sure we catch that:
112*9880d681SAndroid Build Coastguard Worker; adrp -> ldrgot -> str.
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setC
114*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF]
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[LDRGOT_REG]]]
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
121*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
122*9880d681SAndroid Build Coastguard Workerdefine void @setC(i32 %t) {
123*9880d681SAndroid Build Coastguard Workerentry:
124*9880d681SAndroid Build Coastguard Worker  store i32 %t, i32* @C, align 4
125*9880d681SAndroid Build Coastguard Worker  ret void
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; Perform the same tests for internal global and a displacement
129*9880d681SAndroid Build Coastguard Worker; in the addressing mode.
130*9880d681SAndroid Build Coastguard Worker; Indeed we will get an ADD for those instead of LOADGot.
131*9880d681SAndroid Build Coastguard Worker@InternalC = internal global i32 0, align 4
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpAddLdr case when we have a simple chain:
134*9880d681SAndroid Build Coastguard Worker; adrp -> add -> ldr.
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getInternalCPlus4
136*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[ADDGOT_REG]], #16]
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
143*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
144*9880d681SAndroid Build Coastguard Workerdefine i32 @getInternalCPlus4() {
145*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* @InternalC, i32 4
146*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* %addr, align 4
147*9880d681SAndroid Build Coastguard Worker  ret i32 %res
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal.
151*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtInternalCPlus4
153*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[ADDGOT_REG]], #16]
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
160*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
161*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtInternalCPlus4() {
162*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* @InternalC, i32 4
163*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* %addr, align 4
164*9880d681SAndroid Build Coastguard Worker  %sextres = sext i32 %res to i64
165*9880d681SAndroid Build Coastguard Worker  ret i64 %sextres
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is
169*9880d681SAndroid Build Coastguard Worker; used several times.
170*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpAdd for those.
171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralInternalCPlus4
172*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[ADDGOT_REG]], #16]
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0
178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[ADDGOT_REG]], #16]
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
180*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAdd [[ADRP_LABEL]], [[ADDGOT_LABEL]]
181*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralInternalCPlus4(i32 %t) {
182*9880d681SAndroid Build Coastguard Workerentry:
183*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* @InternalC, i32 4
184*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %addr, align 4
185*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp, %t
186*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %addr, align 4
187*9880d681SAndroid Build Coastguard Worker  ret void
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; Make sure we catch that:
191*9880d681SAndroid Build Coastguard Worker; adrp -> add -> str.
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setInternalCPlus4
193*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]:
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[ADDGOT_REG]], #16]
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
200*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddStr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]]
201*9880d681SAndroid Build Coastguard Workerdefine void @setInternalCPlus4(i32 %t) {
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %addr = getelementptr i32, i32* @InternalC, i32 4
204*9880d681SAndroid Build Coastguard Worker  store i32 %t, i32* %addr, align 4
205*9880d681SAndroid Build Coastguard Worker  ret void
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpAddLdr case when we have a simple chain:
209*9880d681SAndroid Build Coastguard Worker; adrp -> ldr.
210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getInternalC
211*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF]
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
216*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr [[ADRP_LABEL]], [[LDR_LABEL]]
217*9880d681SAndroid Build Coastguard Workerdefine i32 @getInternalC() {
218*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* @InternalC, align 4
219*9880d681SAndroid Build Coastguard Worker  ret i32 %res
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal.
223*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtInternalC
225*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF]
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
230*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr [[ADRP_LABEL]], [[LDR_LABEL]]
231*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtInternalC() {
232*9880d681SAndroid Build Coastguard Worker  %res = load i32, i32* @InternalC, align 4
233*9880d681SAndroid Build Coastguard Worker  %sextres = sext i32 %res to i64
234*9880d681SAndroid Build Coastguard Worker  ret i64 %sextres
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is
238*9880d681SAndroid Build Coastguard Worker; used several times.
239*9880d681SAndroid Build Coastguard Worker; Make sure we do not catch anything here. We have a adrp alone,
240*9880d681SAndroid Build Coastguard Worker; there is not much we can do about it.
241*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralInternalC
242*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF]
244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF]
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
247*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralInternalC(i32 %t) {
248*9880d681SAndroid Build Coastguard Workerentry:
249*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* @InternalC, align 4
250*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp, %t
251*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* @InternalC, align 4
252*9880d681SAndroid Build Coastguard Worker  ret void
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker; Make sure we do not catch anything when:
256*9880d681SAndroid Build Coastguard Worker; adrp -> str.
257*9880d681SAndroid Build Coastguard Worker; We cannot fold anything in the str at this point.
258*9880d681SAndroid Build Coastguard Worker; Indeed, strs do not support litterals.
259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setInternalC
260*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF]
262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
263*9880d681SAndroid Build Coastguard Workerdefine void @setInternalC(i32 %t) {
264*9880d681SAndroid Build Coastguard Workerentry:
265*9880d681SAndroid Build Coastguard Worker  store i32 %t, i32* @InternalC, align 4
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; Now check other variant of loads/stores.
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker@D = common global i8 0, align 4
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Worker; LDRB does not support loading from a literal.
274*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot and not AdrpLdrGotLdr for those.
275*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getD
276*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF]
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrb w0, {{\[}}[[LDRGOT_REG]]]
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
282*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]]
283*9880d681SAndroid Build Coastguard Workerdefine i8 @getD() {
284*9880d681SAndroid Build Coastguard Worker  %res = load i8, i8* @D, align 4
285*9880d681SAndroid Build Coastguard Worker  ret i8 %res
286*9880d681SAndroid Build Coastguard Worker}
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setD
289*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
290*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE
291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF]
293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb w0, {{\[}}[[LDRGOT_REG]]]
295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
296*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
297*9880d681SAndroid Build Coastguard Workerdefine void @setD(i8 %t) {
298*9880d681SAndroid Build Coastguard Worker  store i8 %t, i8* @D, align 4
299*9880d681SAndroid Build Coastguard Worker  ret void
300*9880d681SAndroid Build Coastguard Worker}
301*9880d681SAndroid Build Coastguard Worker
302*9880d681SAndroid Build Coastguard Worker; LDRSB supports loading from a literal.
303*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
304*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtD
305*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF]
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsb w0, {{\[}}[[LDRGOT_REG]]]
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
312*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
313*9880d681SAndroid Build Coastguard Workerdefine i32 @getSExtD() {
314*9880d681SAndroid Build Coastguard Worker  %res = load i8, i8* @D, align 4
315*9880d681SAndroid Build Coastguard Worker  %sextres = sext i8 %res to i32
316*9880d681SAndroid Build Coastguard Worker  ret i32 %sextres
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; LDRSB supports loading from a literal.
320*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExt64D
322*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE
324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF]
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsb x0, {{\[}}[[LDRGOT_REG]]]
328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
329*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
330*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExt64D() {
331*9880d681SAndroid Build Coastguard Worker  %res = load i8, i8* @D, align 4
332*9880d681SAndroid Build Coastguard Worker  %sextres = sext i8 %res to i64
333*9880d681SAndroid Build Coastguard Worker  ret i64 %sextres
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker@E = common global i16 0, align 4
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Worker; LDRH does not support loading from a literal.
339*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot and not AdrpLdrGotLdr for those.
340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getE
341*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE
343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF]
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrh w0, {{\[}}[[LDRGOT_REG]]]
346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
347*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]]
348*9880d681SAndroid Build Coastguard Workerdefine i16 @getE() {
349*9880d681SAndroid Build Coastguard Worker  %res = load i16, i16* @E, align 4
350*9880d681SAndroid Build Coastguard Worker  ret i16 %res
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker; LDRSH supports loading from a literal.
354*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtE
356*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE
358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF]
360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
361*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsh w0, {{\[}}[[LDRGOT_REG]]]
362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
363*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
364*9880d681SAndroid Build Coastguard Workerdefine i32 @getSExtE() {
365*9880d681SAndroid Build Coastguard Worker  %res = load i16, i16* @E, align 4
366*9880d681SAndroid Build Coastguard Worker  %sextres = sext i16 %res to i32
367*9880d681SAndroid Build Coastguard Worker  ret i32 %sextres
368*9880d681SAndroid Build Coastguard Worker}
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setE
371*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
372*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE
373*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF]
375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh w0, {{\[}}[[LDRGOT_REG]]]
377*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
378*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
379*9880d681SAndroid Build Coastguard Workerdefine void @setE(i16 %t) {
380*9880d681SAndroid Build Coastguard Worker  store i16 %t, i16* @E, align 4
381*9880d681SAndroid Build Coastguard Worker  ret void
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; LDRSH supports loading from a literal.
385*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExt64E
387*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE
389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF]
391*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsh x0, {{\[}}[[LDRGOT_REG]]]
393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
394*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
395*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExt64E() {
396*9880d681SAndroid Build Coastguard Worker  %res = load i16, i16* @E, align 4
397*9880d681SAndroid Build Coastguard Worker  %sextres = sext i16 %res to i64
398*9880d681SAndroid Build Coastguard Worker  ret i64 %sextres
399*9880d681SAndroid Build Coastguard Worker}
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker@F = common global i64 0, align 4
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker; LDR supports loading from a literal.
404*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getF
406*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
407*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _F@GOTPAGE
408*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _F@GOTPAGEOFF]
410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr x0, {{\[}}[[LDRGOT_REG]]]
412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
413*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
414*9880d681SAndroid Build Coastguard Workerdefine i64 @getF() {
415*9880d681SAndroid Build Coastguard Worker  %res = load i64, i64* @F, align 4
416*9880d681SAndroid Build Coastguard Worker  ret i64 %res
417*9880d681SAndroid Build Coastguard Worker}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setF
420*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _F@GOTPAGE
422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _F@GOTPAGEOFF]
424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str x0, {{\[}}[[LDRGOT_REG]]]
426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
427*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
428*9880d681SAndroid Build Coastguard Workerdefine void @setF(i64 %t) {
429*9880d681SAndroid Build Coastguard Worker  store i64 %t, i64* @F, align 4
430*9880d681SAndroid Build Coastguard Worker  ret void
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker@G = common global float 0.0, align 4
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker; LDR float supports loading from a literal.
436*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
437*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getG
438*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
439*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _G@GOTPAGE
440*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
441*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _G@GOTPAGEOFF]
442*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr s0, {{\[}}[[LDRGOT_REG]]]
444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
445*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
446*9880d681SAndroid Build Coastguard Workerdefine float @getG() {
447*9880d681SAndroid Build Coastguard Worker  %res = load float, float* @G, align 4
448*9880d681SAndroid Build Coastguard Worker  ret float %res
449*9880d681SAndroid Build Coastguard Worker}
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setG
452*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
453*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _G@GOTPAGE
454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
455*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _G@GOTPAGEOFF]
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str s0, {{\[}}[[LDRGOT_REG]]]
458*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
459*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
460*9880d681SAndroid Build Coastguard Workerdefine void @setG(float %t) {
461*9880d681SAndroid Build Coastguard Worker  store float %t, float* @G, align 4
462*9880d681SAndroid Build Coastguard Worker  ret void
463*9880d681SAndroid Build Coastguard Worker}
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker@H = common global half 0.0, align 4
466*9880d681SAndroid Build Coastguard Worker
467*9880d681SAndroid Build Coastguard Worker; LDR half supports loading from a literal.
468*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getH
470*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _H@GOTPAGE
472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _H@GOTPAGEOFF]
474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
475*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr h0, {{\[}}[[LDRGOT_REG]]]
476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
477*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
478*9880d681SAndroid Build Coastguard Workerdefine half @getH() {
479*9880d681SAndroid Build Coastguard Worker  %res = load half, half* @H, align 4
480*9880d681SAndroid Build Coastguard Worker  ret half %res
481*9880d681SAndroid Build Coastguard Worker}
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setH
484*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _H@GOTPAGE
486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
487*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _H@GOTPAGEOFF]
488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, {{\[}}[[LDRGOT_REG]]]
490*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
491*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
492*9880d681SAndroid Build Coastguard Workerdefine void @setH(half %t) {
493*9880d681SAndroid Build Coastguard Worker  store half %t, half* @H, align 4
494*9880d681SAndroid Build Coastguard Worker  ret void
495*9880d681SAndroid Build Coastguard Worker}
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Worker@I = common global double 0.0, align 4
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker; LDR double supports loading from a literal.
500*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
501*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getI
502*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _I@GOTPAGE
504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
505*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _I@GOTPAGEOFF]
506*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr d0, {{\[}}[[LDRGOT_REG]]]
508*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
509*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
510*9880d681SAndroid Build Coastguard Workerdefine double @getI() {
511*9880d681SAndroid Build Coastguard Worker  %res = load double, double* @I, align 4
512*9880d681SAndroid Build Coastguard Worker  ret double %res
513*9880d681SAndroid Build Coastguard Worker}
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setI
516*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _I@GOTPAGE
518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
519*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _I@GOTPAGEOFF]
520*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
521*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str d0, {{\[}}[[LDRGOT_REG]]]
522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
523*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
524*9880d681SAndroid Build Coastguard Workerdefine void @setI(double %t) {
525*9880d681SAndroid Build Coastguard Worker  store double %t, double* @I, align 4
526*9880d681SAndroid Build Coastguard Worker  ret void
527*9880d681SAndroid Build Coastguard Worker}
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Worker@J = common global <2 x i32> <i32 0, i32 0>, align 4
530*9880d681SAndroid Build Coastguard Worker
531*9880d681SAndroid Build Coastguard Worker; LDR 64-bit vector supports loading from a literal.
532*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
533*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getJ
534*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
535*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _J@GOTPAGE
536*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
537*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _J@GOTPAGEOFF]
538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr d0, {{\[}}[[LDRGOT_REG]]]
540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
541*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
542*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @getJ() {
543*9880d681SAndroid Build Coastguard Worker  %res = load <2 x i32>, <2 x i32>* @J, align 4
544*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %res
545*9880d681SAndroid Build Coastguard Worker}
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setJ
548*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
549*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _J@GOTPAGE
550*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
551*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _J@GOTPAGEOFF]
552*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str d0, {{\[}}[[LDRGOT_REG]]]
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
555*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
556*9880d681SAndroid Build Coastguard Workerdefine void @setJ(<2 x i32> %t) {
557*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %t, <2 x i32>* @J, align 4
558*9880d681SAndroid Build Coastguard Worker  ret void
559*9880d681SAndroid Build Coastguard Worker}
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker@K = common global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 4
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker; LDR 128-bit vector supports loading from a literal.
564*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
565*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getK
566*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _K@GOTPAGE
568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
569*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _K@GOTPAGEOFF]
570*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
571*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr q0, {{\[}}[[LDRGOT_REG]]]
572*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
573*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
574*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @getK() {
575*9880d681SAndroid Build Coastguard Worker  %res = load <4 x i32>, <4 x i32>* @K, align 4
576*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %res
577*9880d681SAndroid Build Coastguard Worker}
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setK
580*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
581*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _K@GOTPAGE
582*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _K@GOTPAGEOFF]
584*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]:
585*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str q0, {{\[}}[[LDRGOT_REG]]]
586*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
587*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]]
588*9880d681SAndroid Build Coastguard Workerdefine void @setK(<4 x i32> %t) {
589*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %t, <4 x i32>* @K, align 4
590*9880d681SAndroid Build Coastguard Worker  ret void
591*9880d681SAndroid Build Coastguard Worker}
592*9880d681SAndroid Build Coastguard Worker
593*9880d681SAndroid Build Coastguard Worker@L = common global <1 x i8> <i8 0>, align 4
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Worker; LDR 8-bit vector supports loading from a literal.
596*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those.
597*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getL
598*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _L@GOTPAGE
600*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
601*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _L@GOTPAGEOFF]
602*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]:
603*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr b0, {{\[}}[[LDRGOT_REG]]]
604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
605*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]]
606*9880d681SAndroid Build Coastguard Workerdefine <1 x i8> @getL() {
607*9880d681SAndroid Build Coastguard Worker  %res = load <1 x i8>, <1 x i8>* @L, align 4
608*9880d681SAndroid Build Coastguard Worker  ret <1 x i8> %res
609*9880d681SAndroid Build Coastguard Worker}
610*9880d681SAndroid Build Coastguard Worker
611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setL
612*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]:
613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _L@GOTPAGE
614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]:
615*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _L@GOTPAGEOFF]
616*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; kill
617*9880d681SAndroid Build Coastguard Worker; Ultimately we should generate str b0, but right now, we match the vector
618*9880d681SAndroid Build Coastguard Worker; variant which does not allow to fold the immediate into the store.
619*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st1.b { v0 }[0], {{\[}}[[LDRGOT_REG]]]
620*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
621*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]]
622*9880d681SAndroid Build Coastguard Workerdefine void @setL(<1 x i8> %t) {
623*9880d681SAndroid Build Coastguard Worker  store <1 x i8> %t, <1 x i8>* @L, align 4
624*9880d681SAndroid Build Coastguard Worker  ret void
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker; Make sure we do not assert when we do not track
628*9880d681SAndroid Build Coastguard Worker; all the aliases of a tuple register.
629*9880d681SAndroid Build Coastguard Worker; Indeed the tuple register can be tracked because of
630*9880d681SAndroid Build Coastguard Worker; one of its element, but the other elements of the tuple
631*9880d681SAndroid Build Coastguard Worker; do not need to be tracked and we used to assert on that.
632*9880d681SAndroid Build Coastguard Worker; Note: The test case is fragile in the sense that we need
633*9880d681SAndroid Build Coastguard Worker; a tuple register to appear in the lowering. Thus, the target
634*9880d681SAndroid Build Coastguard Worker; cpu is required to have the problem reproduced.
635*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _uninterestingSub
636*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], [[CONSTPOOL:lCPI[0-9]+_[0-9]+]]@PAGE
637*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr q[[IDX:[0-9]+]], {{\[}}[[ADRP_REG]], [[CONSTPOOL]]@PAGEOFF]
638*9880d681SAndroid Build Coastguard Worker; The tuple comes from the next instruction.
639*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tbl.16b v{{[0-9]+}}, { v{{[0-9]+}}, v{{[0-9]+}} }, v[[IDX]]
640*9880d681SAndroid Build Coastguard Worker; CHECK: ret
641*9880d681SAndroid Build Coastguard Workerdefine void @uninterestingSub(i8* nocapture %row) #0 {
642*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast i8* %row to <16 x i8>*
643*9880d681SAndroid Build Coastguard Worker  %tmp1 = load <16 x i8>, <16 x i8>* %tmp, align 16
644*9880d681SAndroid Build Coastguard Worker  %vext43 = shufflevector <16 x i8> <i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %tmp1, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>
645*9880d681SAndroid Build Coastguard Worker  %add.i.414 = add <16 x i8> zeroinitializer, %vext43
646*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %add.i.414, <16 x i8>* %tmp, align 16
647*9880d681SAndroid Build Coastguard Worker  %add.ptr51 = getelementptr inbounds i8, i8* %row, i64 16
648*9880d681SAndroid Build Coastguard Worker  %tmp2 = bitcast i8* %add.ptr51 to <16 x i8>*
649*9880d681SAndroid Build Coastguard Worker  %tmp3 = load <16 x i8>, <16 x i8>* %tmp2, align 16
650*9880d681SAndroid Build Coastguard Worker  %tmp4 = bitcast i8* undef to <16 x i8>*
651*9880d681SAndroid Build Coastguard Worker  %tmp5 = load <16 x i8>, <16 x i8>* %tmp4, align 16
652*9880d681SAndroid Build Coastguard Worker  %vext157 = shufflevector <16 x i8> %tmp3, <16 x i8> %tmp5, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>
653*9880d681SAndroid Build Coastguard Worker  %add.i.402 = add <16 x i8> zeroinitializer, %vext157
654*9880d681SAndroid Build Coastguard Worker  store <16 x i8> %add.i.402, <16 x i8>* %tmp4, align 16
655*9880d681SAndroid Build Coastguard Worker  ret void
656*9880d681SAndroid Build Coastguard Worker}
657*9880d681SAndroid Build Coastguard Worker
658*9880d681SAndroid Build Coastguard Worker@.str.89 = external unnamed_addr constant [12 x i8], align 1
659*9880d681SAndroid Build Coastguard Worker@.str.90 = external unnamed_addr constant [5 x i8], align 1
660*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_r274582
661*9880d681SAndroid Build Coastguard Workerdefine void @test_r274582() {
662*9880d681SAndroid Build Coastguard Workerentry:
663*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %if.then.i, label %if.end.i
664*9880d681SAndroid Build Coastguard Workerif.then.i:
665*9880d681SAndroid Build Coastguard Worker  ret void
666*9880d681SAndroid Build Coastguard Workerif.end.i:
667*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAdrp Lloh91, Lloh93
668*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr Lloh91, Lloh92
669*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot Lloh93, Lloh95
670*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot Lloh94, Lloh96
671*9880d681SAndroid Build Coastguard Worker  %mul.i.i.i = fmul double undef, 1.000000e-06
672*9880d681SAndroid Build Coastguard Worker  %add.i.i.i = fadd double undef, %mul.i.i.i
673*9880d681SAndroid Build Coastguard Worker  %sub.i.i = fsub double %add.i.i.i, undef
674*9880d681SAndroid Build Coastguard Worker  call void (i8*, ...) @callee(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.89, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.90, i64 0, i64 0), double %sub.i.i)
675*9880d681SAndroid Build Coastguard Worker  unreachable
676*9880d681SAndroid Build Coastguard Worker}
677*9880d681SAndroid Build Coastguard Workerdeclare void @callee(i8* nocapture readonly, ...)
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Workerattributes #0 = { "target-cpu"="cyclone" }
680