xref: /llvm-project/llvm/test/CodeGen/ARM/arm-position-independence.ll (revision d89b771ef5fe39403a2ad525fa36efbc4ce2a517)
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
5
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
10
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
15
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
18
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
21
22target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
23
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
31
32define i32 @read() {
33entry:
34  %0 = load i32, ptr @a, align 4
35  ret i32 %0
36; CHECK-LABEL: read:
37
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]]]
41
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]]]
45
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]]]
48
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]]]
52
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]]]
56
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]]]
59
60; THUMB1_RW_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
61; THUMB1_RW_ABS: ldr     r0, [r[[REG]]]
62
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]]]
66
67; CHECK: {{(bx lr|pop)}}
68
69; NO_MOVT_ARM_RW_SB: [[LCPI]]
70; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
71
72; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
73; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
74
75; THUMB1_RW_ABS: [[LCPI]]
76; THUMB1_RW_ABS-NEXT: .long a
77
78; THUMB1_RW_SB: [[LCPI]]
79; THUMB1_RW_SB: .long   a(sbrel)
80}
81
82define void @write(i32 %v)  {
83entry:
84  store i32 %v, ptr @a, align 4
85  ret void
86; CHECK-LABEL: write:
87
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]]]]
91
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]]]]
95
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]]]
98
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]]]
102
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]]]
106
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]]]
109
110; THUMB1_RW_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
111; THUMB1_RW_ABS: str     r0, [r[[REG]]]
112
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]]]
116
117; CHECK: {{(bx lr|pop)}}
118
119; NO_MOVT_ARM_RW_SB: [[LCPI]]
120; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
121
122; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
123; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
124
125; THUMB1_RW_ABS: [[LCPI]]
126; THUMB1_RW_ABS-NEXT: .long a
127
128; THUMB1_RW_SB: [[LCPI]]
129; THUMB1_RW_SB: .long   a(sbrel)
130}
131
132define i32 @read_const()  {
133entry:
134  %0 = load i32, ptr @b, align 4
135  ret i32 %0
136; CHECK-LABEL: read_const:
137
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]]]
141
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]]]
144
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]]]
149
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]]]
153
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]]]
157
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]]]
160
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]]]
166
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]]]
171
172
173; THUMB1_RO_ABS: ldr     r[[REG:[0-9]]], [[LCPI:.LCPI[0-9]+_[0-9]+]]
174; THUMB1_RO_ABS: ldr     r0, [r[[REG]]]
175
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]]]
180
181; CHECK: {{(bx lr|pop)}}
182
183; NO_MOVT_ARM_RO_ABS: [[LCPI]]
184; NO_MOVT_ARM_RO_ABS-NEXT: .long b
185
186; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
187; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b
188
189; THUMB1_RO_ABS: [[LCPI]]
190; THUMB1_RO_ABS-NEXT: .long b
191
192; NO_MOVT_ARM_RO_PC: [[LCPI]]
193; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8)
194
195; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
196; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4)
197
198; THUMB1_RO_PC: [[LCPI]]
199; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4)
200}
201
202define ptr @take_addr()  {
203entry:
204  ret ptr @a
205; CHECK-LABEL: take_addr:
206
207; ARM_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
208; ARM_RW_ABS: movt    r[[REG]], :upper16:a
209
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]]
213
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]]
216
217; THUMB2_RW_ABS: movw    r[[REG:[0-9]]], :lower16:a
218; THUMB2_RW_ABS: movt    r[[REG]], :upper16:a
219
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
223
224; NO_MOVT_THUMB2_RW_SB: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
225; NO_MOVT_THUMB2_RW_SB: add     r0, r9
226
227; THUMB1_RW_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
228
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]]
232
233; CHECK: {{(bx lr|pop)}}
234
235; NO_MOVT_ARM_RW_SB: [[LCPI]]
236; NO_MOVT_ARM_RW_SB: .long   a(sbrel)
237
238; NO_MOVT_THUMB2_RW_SB: [[LCPI]]
239; NO_MOVT_THUMB2_RW_SB: .long   a(sbrel)
240
241; THUMB1_RW_ABS: [[LCPI]]
242; THUMB1_RW_ABS-NEXT: .long a
243
244; THUMB1_RW_SB: [[LCPI]]
245; THUMB1_RW_SB: .long   a(sbrel)
246}
247
248define ptr @take_addr_const()  {
249entry:
250  ret ptr @b
251; CHECK-LABEL: take_addr_const:
252
253; ARM_RO_ABS: movw    r[[REG:[0-9]]], :lower16:b
254; ARM_RO_ABS: movt    r[[REG]], :upper16:b
255
256; NO_MOVT_ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
257
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]]]
262
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]]
266
267; THUMB2_RO_ABS: movw    r[[REG:[0-9]]], :lower16:b
268; THUMB2_RO_ABS: movt    r[[REG]], :upper16:b
269
270; NO_MOVT_THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
271
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
276
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
280
281; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
282
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
286
287; CHECK: {{(bx lr|pop)}}
288
289; NO_MOVT_ARM_RO_ABS: [[LCPI]]
290; NO_MOVT_ARM_RO_ABS-NEXT: .long b
291
292; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
293; NO_MOVT_THUMB2_RO_ABS-NEXT: .long b
294
295; THUMB1_RO_ABS: [[LCPI]]
296; THUMB1_RO_ABS-NEXT: .long b
297
298; NO_MOVT_ARM_RO_PC: [[LCPI]]
299; NO_MOVT_ARM_RO_PC-NEXT: .long b-([[LPC]]+8)
300
301; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
302; NO_MOVT_THUMB2_RO_PC-NEXT: .long b-([[LPC]]+4)
303
304; THUMB1_RO_PC: [[LCPI]]
305; THUMB1_RO_PC-NEXT: .long b-([[LPC]]+4)
306}
307
308define ptr @take_addr_func()  {
309entry:
310  ret ptr @take_addr_func
311; CHECK-LABEL: take_addr_func:
312
313; ARM_RO_ABS: movw    r[[REG:[0-9]]], :lower16:take_addr_func
314; ARM_RO_ABS: movt    r[[REG]], :upper16:take_addr_func
315
316; NO_MOVT_ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
317
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]]]
322
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]]
326
327; THUMB2_RO_ABS: movw    r[[REG:[0-9]]], :lower16:take_addr_func
328; THUMB2_RO_ABS: movt    r[[REG]], :upper16:take_addr_func
329
330; NO_MOVT_THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
331
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
336
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
340
341; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
342
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
346
347; CHECK: {{(bx lr|pop)}}
348
349; NO_MOVT_ARM_RO_ABS: [[LCPI]]
350; NO_MOVT_ARM_RO_ABS-NEXT: .long take_addr_func
351
352; NO_MOVT_THUMB2_RO_ABS: [[LCPI]]
353; NO_MOVT_THUMB2_RO_ABS-NEXT: .long take_addr_func
354
355; THUMB1_RO_ABS: [[LCPI]]
356; THUMB1_RO_ABS-NEXT: .long take_addr_func
357
358; NO_MOVT_ARM_RO_PC: [[LCPI]]
359; NO_MOVT_ARM_RO_PC-NEXT: .long take_addr_func-([[LPC]]+8)
360
361; NO_MOVT_THUMB2_RO_PC: [[LCPI]]
362; NO_MOVT_THUMB2_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4)
363
364; THUMB1_RO_PC: [[LCPI]]
365; THUMB1_RO_PC-NEXT: .long take_addr_func-([[LPC]]+4)
366}
367
368define ptr @take_addr_alias()  {
369entry:
370  ret ptr @c1
371}
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]]
376
377define ptr @take_addr_const_alias()  {
378entry:
379  ret ptr @d1
380}
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]]
386
387define weak ptr @take_addr_func_alias()  {
388entry:
389  ret ptr @take_addr_func_alias1
390}
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]]
396
397define ptr @block_addr() {
398entry:
399  br label %lab1
400
401lab1:
402  ret ptr blockaddress(@block_addr, %lab1)
403
404; CHECK-LABEL: block_addr:
405
406; ARM_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
407; ARM_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
408
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]]
413
414; THUMB2_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
415; THUMB2_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
416
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
421
422; THUMB1_RO_ABS: [[LTMP:.Ltmp[0-9]+]]:
423; THUMB1_RO_ABS: ldr     r0, [[LCPI:.LCPI[0-9]+_[0-9]+]]
424
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
429
430; CHECK: bx lr
431
432; ARM_RO_ABS: [[LCPI]]
433; ARM_RO_ABS-NEXT: .long   [[LTMP]]
434
435; ARM_RO_PC: [[LCPI]]
436; ARM_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+8)
437
438; THUMB2_RO_ABS: [[LCPI]]
439; THUMB2_RO_ABS-NEXT: .long   [[LTMP]]
440
441; THUMB2_RO_PC: [[LCPI]]
442; THUMB2_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+4)
443
444; THUMB1_RO_ABS: [[LCPI]]
445; THUMB1_RO_ABS-NEXT: .long   [[LTMP]]
446
447; THUMB1_RO_PC: [[LCPI]]
448; THUMB1_RO_PC-NEXT: .long   [[LTMP]]-([[LPC]]+4)
449}
450