Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / ARM / arm-position-independence.ll
blobf6be5866c2838c369dded865f655e4bf033519e5
1 ; RUN: llc -relocation-model=static    -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_ABS
2 ; RUN: llc -relocation-model=ropi      -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC  --check-prefix=ARM_RW_ABS
3 ; RUN: llc -relocation-model=rwpi      -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_ABS --check-prefix=ARM_RW_SB
4 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=ARM_RO_PC  --check-prefix=ARM_RW_SB
6 ; RUN: llc -relocation-model=static    -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS --check-prefix=THUMB2_RW_ABS
7 ; RUN: llc -relocation-model=ropi      -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC  --check-prefix=THUMB2_RW_ABS
8 ; RUN: llc -relocation-model=rwpi      -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_ABS  --check-prefix=THUMB2_RW_SB
9 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB2_RO_PC  --check-prefix=THUMB2_RW_SB
11 ; RUN: llc -relocation-model=static    -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_ABS
12 ; RUN: llc -relocation-model=ropi      -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC  --check-prefix=THUMB1_RW_ABS
13 ; RUN: llc -relocation-model=rwpi      -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_ABS --check-prefix=THUMB1_RW_SB
14 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv6m--none-eabi < %s | FileCheck %s --check-prefix=CHECK --check-prefix=THUMB1_RO_PC  --check-prefix=THUMB1_RW_SB
16 ; RUN: llc -relocation-model=rwpi      -mtriple=armv7a--none-eabi   -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_ABS --check-prefix=NO_MOVT_ARM_RW_SB
17 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=armv7a--none-eabi   -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_ARM_RO_PC  --check-prefix=NO_MOVT_ARM_RW_SB
19 ; RUN: llc -relocation-model=rwpi      -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_ABS  --check-prefix=NO_MOVT_THUMB2_RW_SB
20 ; RUN: llc -relocation-model=ropi-rwpi -mtriple=thumbv7m--none-eabi -mattr=no-movt < %s | FileCheck %s --check-prefix=CHECK --check-prefix=NO_MOVT_THUMB2_RO_PC  --check-prefix=NO_MOVT_THUMB2_RW_SB
22 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
24 @a = external global i32, align 4
25 @b = external constant i32, align 4
26 @c0 = global i32 42, align 4
27 @c1 = alias i32, ptr @c0
28 @d0 = constant i32 42, align 4
29 @d1 = alias i32, ptr @d0
30 @take_addr_func_alias1 = alias ptr (), ptr @take_addr_func_alias
32 define i32 @read() {
33 entry:
34   %0 = load i32, ptr @a, align 4
35   ret i32 %0
36 ; CHECK-LABEL: read:
38 ; ARM_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
39 ; ARM_RW_ABS: movt    r[[REG]], :upper16:a
40 ; ARM_RW_ABS: ldr     r0, [r[[REG]]]
42 ; ARM_RW_SB: movw    r[[REG:[0-9]]], :lower16:a(sbrel)
43 ; ARM_RW_SB: movt    r[[REG]], :upper16:a(sbrel)
44 ; ARM_RW_SB: ldr     r0, [r9, r[[REG]]]
46 ; NO_MOVT_ARM_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
47 ; NO_MOVT_ARM_RW_SB: ldr     r0, [r9, r[[REG]]]
49 ; THUMB2_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
50 ; THUMB2_RW_ABS: movt    r[[REG]], :upper16:a
51 ; THUMB2_RW_ABS: ldr     r0, [r[[REG]]]
53 ; THUMB2_RW_SB: movw    r[[REG:[0-9]]], :lower16:a(sbrel)
54 ; THUMB2_RW_SB: movt    r[[REG]], :upper16:a(sbrel)
55 ; THUMB2_RW_SB: ldr.w   r0, [r9, r[[REG]]]
57 ; NO_MOVT_THUMB2_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
58 ; NO_MOVT_THUMB2_RW_SB: ldr.w   r0, [r9, r[[REG]]]
60 ; THUMB1_RW_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
61 ; THUMB1_RW_ABS: ldr     r0, [r[[REG]]]
63 ; THUMB1_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
64 ; THUMB1_RW_SB: mov     r[[REG_SB:[0-9]+]], r9
65 ; THUMB1_RW_SB: ldr     r0, [r[[REG_SB]], r[[REG]]]
67 ; CHECK: {{(bx lr|pop)}}
69 ; NO_MOVT_ARM_RW_SB: [[LCPI]]
70 ; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
72 ; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
73 ; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
75 ; THUMB1_RW_ABS: [[LCPI]]
76 ; THUMB1_RW_ABS-NEXT: .long a
78 ; THUMB1_RW_SB: [[LCPI]]
79 ; THUMB1_RW_SB: .long   a(sbrel)
82 define void @write(i32 %v)  {
83 entry:
84   store i32 %v, ptr @a, align 4
85   ret void
86 ; CHECK-LABEL: write:
88 ; ARM_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
89 ; ARM_RW_ABS: movt    r[[REG]], :upper16:a
90 ; ARM_RW_ABS: str     r0, [r[[REG:[0-9]]]]
92 ; ARM_RW_SB: movw    r[[REG:[0-9]]], :lower16:a
93 ; ARM_RW_SB: movt    r[[REG]], :upper16:a
94 ; ARM_RW_SB: str     r0, [r9, r[[REG:[0-9]]]]
96 ; NO_MOVT_ARM_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
97 ; NO_MOVT_ARM_RW_SB: str     r0, [r9, r[[REG]]]
99 ; THUMB2_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
100 ; THUMB2_RW_ABS: movt    r[[REG]], :upper16:a
101 ; THUMB2_RW_ABS: str     r0, [r[[REG]]]
103 ; THUMB2_RW_SB: movw    r[[REG:[0-9]]], :lower16:a(sbrel)
104 ; THUMB2_RW_SB: movt    r[[REG]], :upper16:a(sbrel)
105 ; THUMB2_RW_SB: str.w   r0, [r9, r[[REG]]]
107 ; NO_MOVT_THUMB2_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
108 ; NO_MOVT_THUMB2_RW_SB: str.w   r0, [r9, r[[REG]]]
110 ; THUMB1_RW_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
111 ; THUMB1_RW_ABS: str     r0, [r[[REG]]]
113 ; THUMB1_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
114 ; THUMB1_RW_SB: mov     r[[REG_SB:[0-9]+]], r9
115 ; THUMB1_RW_SB: str     r0, [r[[REG_SB]], r[[REG]]]
117 ; CHECK: {{(bx lr|pop)}}
119 ; NO_MOVT_ARM_RW_SB: [[LCPI]]
120 ; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
122 ; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
123 ; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
125 ; THUMB1_RW_ABS: [[LCPI]]
126 ; THUMB1_RW_ABS-NEXT: .long a
128 ; THUMB1_RW_SB: [[LCPI]]
129 ; THUMB1_RW_SB: .long   a(sbrel)
132 define i32 @read_const()  {
133 entry:
134   %0 = load i32, ptr @b, align 4
135   ret i32 %0
136 ; CHECK-LABEL: read_const:
138 ; ARM_RO_ABS: movw    r[[reg:[0-9]]], :lower16:b
139 ; ARM_RO_ABS: movt    r[[reg]], :upper16:b
140 ; ARM_RO_ABS: ldr     r0, [r[[reg]]]
142 ; NO_MOVT_ARM_RO_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
143 ; NO_MOVT_ARM_RO_ABS: ldr     r0, [r[[REG]]]
145 ; ARM_RO_PC: movw    r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8))
146 ; ARM_RO_PC: movt    r[[REG]], :upper16:(b-([[LPC]]+8))
147 ; ARM_RO_PC: [[LPC]]:
148 ; ARM_RO_PC-NEXT: ldr     r0, [pc, r[[REG]]]
150 ; NO_MOVT_ARM_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
151 ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
152 ; NO_MOVT_ARM_RO_PC: ldr     r0, [pc, r[[REG]]]
154 ; THUMB2_RO_ABS: movw    r[[REG:[0-9]]], :lower16:b
155 ; THUMB2_RO_ABS: movt    r[[REG]], :upper16:b
156 ; THUMB2_RO_ABS: ldr     r0, [r[[REG]]]
158 ; NO_MOVT_THUMB2_RO_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
159 ; NO_MOVT_THUMB2_RO_ABS: ldr     r0, [r[[REG]]]
161 ; THUMB2_RO_PC: movw    r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4))
162 ; THUMB2_RO_PC: movt    r[[REG]], :upper16:(b-([[LPC]]+4))
163 ; THUMB2_RO_PC: [[LPC]]:
164 ; THUMB2_RO_PC-NEXT: add     r[[REG]], pc
165 ; THUMB2_RO_PC: ldr     r0, [r[[REG]]]
167 ; NO_MOVT_THUMB2_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
168 ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
169 ; NO_MOVT_THUMB2_RO_PC-NEXT: add     r[[REG]], pc
170 ; NO_MOVT_THUMB2_RO_PC: ldr     r0, [r[[REG]]]
173 ; THUMB1_RO_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
174 ; THUMB1_RO_ABS: ldr     r0, [r[[REG]]]
176 ; THUMB1_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
177 ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
178 ; THUMB1_RO_PC-NEXT: add     r[[REG]], pc
179 ; THUMB1_RO_PC: ldr     r0, [r[[REG]]]
181 ; CHECK: {{(bx lr|pop)}}
183 ; NO_MOVT_ARM_RO_ABS: [[LCPI]]
184 ; NO_MOVT_ARM_RO_ABS-NEXT: .long b
186 ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
187 ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b
189 ; THUMB1_RO_ABS: [[LCPI]]
190 ; THUMB1_RO_ABS-NEXT: .long b
192 ; NO_MOVT_ARM_RO_PC: [[LCPI]]
193 ; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8)
195 ; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
196 ; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4)
198 ; THUMB1_RO_PC: [[LCPI]]
199 ; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4)
202 define ptr @take_addr()  {
203 entry:
204   ret ptr @a
205 ; CHECK-LABEL: take_addr:
207 ; ARM_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
208 ; ARM_RW_ABS: movt    r[[REG]], :upper16:a
210 ; ARM_RW_SB: movw    r[[REG:[0-9]]], :lower16:a(sbrel)
211 ; ARM_RW_SB: movt    r[[REG]], :upper16:a(sbrel)
212 ; ARM_RW_SB: add     r0, r9, r[[REG]]
214 ; NO_MOVT_ARM_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
215 ; NO_MOVT_ARM_RW_SB: add     r0, r9, r[[REG]]
217 ; THUMB2_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
218 ; THUMB2_RW_ABS: movt    r[[REG]], :upper16:a
220 ; THUMB2_RW_SB: movw    r[[REG:[0-9]]], :lower16:a(sbrel)
221 ; THUMB2_RW_SB: movt    r[[REG]], :upper16:a(sbrel)
222 ; THUMB2_RW_SB: add     r0, r9
224 ; NO_MOVT_THUMB2_RW_SB: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
225 ; NO_MOVT_THUMB2_RW_SB: add     r0, r9
227 ; THUMB1_RW_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
229 ; THUMB1_RW_SB: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
230 ; THUMB1_RW_SB: mov     r[[REG_SB:[0-9]+]], r9
231 ; THUMB1_RW_SB: adds    r[[REG]], r[[REG_SB]], r[[REG]]
233 ; CHECK: {{(bx lr|pop)}}
235 ; NO_MOVT_ARM_RW_SB: [[LCPI]]
236 ; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
238 ; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
239 ; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
241 ; THUMB1_RW_ABS: [[LCPI]]
242 ; THUMB1_RW_ABS-NEXT: .long a
244 ; THUMB1_RW_SB: [[LCPI]]
245 ; THUMB1_RW_SB: .long   a(sbrel)
248 define ptr @take_addr_const()  {
249 entry:
250   ret ptr @b
251 ; CHECK-LABEL: take_addr_const:
253 ; ARM_RO_ABS: movw    r[[REG:[0-9]]], :lower16:b
254 ; ARM_RO_ABS: movt    r[[REG]], :upper16:b
256 ; NO_MOVT_ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
258 ; ARM_RO_PC: movw    r[[REG:[0-9]]], :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+8))
259 ; ARM_RO_PC: movt    r[[REG]], :upper16:(b-([[LPC]]+8))
260 ; ARM_RO_PC: [[LPC]]:
261 ; ARM_RO_PC-NEXT: add     r0, pc, r[[REG:[0-9]]]
263 ; NO_MOVT_ARM_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
264 ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
265 ; NO_MOVT_ARM_RO_PC-NEXT: add     r0, pc, r[[REG]]
267 ; THUMB2_RO_ABS: movw    r[[REG:[0-9]]], :lower16:b
268 ; THUMB2_RO_ABS: movt    r[[REG]], :upper16:b
270 ; NO_MOVT_THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
272 ; THUMB2_RO_PC: movw    r0, :lower16:(b-([[LPC:.LPC[0-9]+_[0-9]+]]+4))
273 ; THUMB2_RO_PC: movt    r0, :upper16:(b-([[LPC]]+4))
274 ; THUMB2_RO_PC: [[LPC]]:
275 ; THUMB2_RO_PC-NEXT: add     r0, pc
277 ; NO_MOVT_THUMB2_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
278 ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
279 ; NO_MOVT_THUMB2_RO_PC-NEXT: add     r[[REG]], pc
281 ; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
283 ; THUMB1_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
284 ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
285 ; THUMB1_RO_PC-NEXT: add     r[[REG]], pc
287 ; CHECK: {{(bx lr|pop)}}
289 ; NO_MOVT_ARM_RO_ABS: [[LCPI]]
290 ; NO_MOVT_ARM_RO_ABS-NEXT: .long b
292 ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
293 ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b
295 ; THUMB1_RO_ABS: [[LCPI]]
296 ; THUMB1_RO_ABS-NEXT: .long b
298 ; NO_MOVT_ARM_RO_PC: [[LCPI]]
299 ; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8)
301 ; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
302 ; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4)
304 ; THUMB1_RO_PC: [[LCPI]]
305 ; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4)
308 define ptr @take_addr_func()  {
309 entry:
310   ret ptr @take_addr_func
311 ; CHECK-LABEL: take_addr_func:
313 ; ARM_RO_ABS: movw    r[[REG:[0-9]]], :lower16:take_addr_func
314 ; ARM_RO_ABS: movt    r[[REG]], :upper16:take_addr_func
316 ; NO_MOVT_ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
318 ; ARM_RO_PC: movw    r[[REG:[0-9]]], :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+8))
319 ; ARM_RO_PC: movt    r[[REG]], :upper16:(take_addr_func-([[LPC]]+8))
320 ; ARM_RO_PC: [[LPC]]:
321 ; ARM_RO_PC-NEXT: add     r0, pc, r[[REG:[0-9]]]
323 ; NO_MOVT_ARM_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
324 ; NO_MOVT_ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
325 ; NO_MOVT_ARM_RO_PC-NEXT: add     r0, pc, r[[REG]]
327 ; THUMB2_RO_ABS: movw    r[[REG:[0-9]]], :lower16:take_addr_func
328 ; THUMB2_RO_ABS: movt    r[[REG]], :upper16:take_addr_func
330 ; NO_MOVT_THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
332 ; THUMB2_RO_PC: movw    r0, :lower16:(take_addr_func-([[LPC:.LPC[0-9]+_[0-9]+]]+4))
333 ; THUMB2_RO_PC: movt    r0, :upper16:(take_addr_func-([[LPC]]+4))
334 ; THUMB2_RO_PC: [[LPC]]:
335 ; THUMB2_RO_PC-NEXT: add     r0, pc
337 ; NO_MOVT_THUMB2_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
338 ; NO_MOVT_THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
339 ; NO_MOVT_THUMB2_RO_PC-NEXT: add     r[[REG]], pc
341 ; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
343 ; THUMB1_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
344 ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
345 ; THUMB1_RO_PC-NEXT: add     r[[REG]], pc
347 ; CHECK: {{(bx lr|pop)}}
349 ; NO_MOVT_ARM_RO_ABS: [[LCPI]]
350 ; NO_MOVT_ARM_RO_ABS-NEXT: .long take_addr_func
352 ; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
353 ; NO_MOVT_THUMB2_RO_ABS-NEXT: .long take_addr_func
355 ; THUMB1_RO_ABS: [[LCPI]]
356 ; THUMB1_RO_ABS-NEXT: .long take_addr_func
358 ; NO_MOVT_ARM_RO_PC: [[LCPI]]
359 ; NO_MOVT_ARM_RO_PC-NEXT: .long take_addr_func-([[LPC]]+8)
361 ; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
362 ; NO_MOVT_THUMB2_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4)
364 ; THUMB1_RO_PC: [[LCPI]]
365 ; THUMB1_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4)
368 define ptr @take_addr_alias()  {
369 entry:
370   ret ptr @c1
372 ; CHECK-LABEL: take_addr_alias:
373 ; ARM_RW_SB: movw    r[[REG:[0-9]]], :lower16:c1(sbrel)
374 ; ARM_RW_SB: movt    r[[REG]], :upper16:c1(sbrel)
375 ; ARM_RW_SB: add     r0, r9, r[[REG]]
377 define ptr @take_addr_const_alias()  {
378 entry:
379   ret ptr @d1
381 ; CHECK-LABEL: take_addr_const_alias:
382 ; ARM_RO_PC:      movw    [[REG:r[0-9]]], :lower16:(d1-([[LPC:.LPC[0-9]+_[0-9]+]]+8))
383 ; ARM_RO_PC-NEXT: movt    [[REG]], :upper16:(d1-([[LPC]]+8))
384 ; ARM_RO_PC-NEXT: [[LPC]]:
385 ; ARM_RO_PC-NEXT: add     r0, pc, [[REG]]
387 define weak ptr @take_addr_func_alias()  {
388 entry:
389   ret ptr @take_addr_func_alias1
391 ; CHECK-LABEL: take_addr_func_alias:
392 ; ARM_RO_PC:      movw    [[REG:r[0-9]]], :lower16:(take_addr_func_alias1-([[LPC:.LPC[0-9]+_[0-9]+]]+8))
393 ; ARM_RO_PC-NEXT: movt    [[REG]], :upper16:(take_addr_func_alias1-([[LPC]]+8))
394 ; ARM_RO_PC-NEXT: [[LPC]]:
395 ; ARM_RO_PC-NEXT: add     r0, pc, [[REG]]
397 define ptr @block_addr() {
398 entry:
399   br label %lab1
401 lab1:
402   ret ptr blockaddress(@block_addr, %lab1)
404 ; CHECK-LABEL: block_addr:
406 ; ARM_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
407 ; ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
409 ; ARM_RO_PC: [[LTMP:.Ltmp[0-9]+]]:
410 ; ARM_RO_PC: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
411 ; ARM_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
412 ; ARM_RO_PC: add     r0, pc, r[[REG]]
414 ; THUMB2_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
415 ; THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
417 ; THUMB2_RO_PC: [[LTMP:.Ltmp[0-9]+]]:
418 ; THUMB2_RO_PC: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
419 ; THUMB2_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
420 ; THUMB2_RO_PC: add     r0, pc
422 ; THUMB1_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
423 ; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
425 ; THUMB1_RO_PC: [[LTMP:.Ltmp[0-9]+]]:
426 ; THUMB1_RO_PC: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
427 ; THUMB1_RO_PC: [[LPC:.LPC[0-9]+_[0-9]+]]:
428 ; THUMB1_RO_PC: add     r0, pc
430 ; CHECK: bx lr
432 ; ARM_RO_ABS: [[LCPI]]
433 ; ARM_RO_ABS-NEXT: .long   [[LTMP]]
435 ; ARM_RO_PC: [[LCPI]]
436 ; ARM_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+8)
438 ; THUMB2_RO_ABS: [[LCPI]]
439 ; THUMB2_RO_ABS-NEXT: .long   [[LTMP]]
441 ; THUMB2_RO_PC: [[LCPI]]
442 ; THUMB2_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+4)
444 ; THUMB1_RO_ABS: [[LCPI]]
445 ; THUMB1_RO_ABS-NEXT: .long   [[LTMP]]
447 ; THUMB1_RO_PC: [[LCPI]]
448 ; THUMB1_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+4)