1; RUN: llc %s -o - -mtriple=thumbv7-apple-darwin10
2; RUN: llc %s -o -
3
4; REQUIRES: arm-registered-target
5
6; NVPTX cannot select BlockAddress
7; XFAIL: nvptx
8
9;; Reference to a label that gets deleted.
10define i8* @test1() nounwind {
11entry:
12	ret i8* blockaddress(@test1b, %test_label)
13}
14
15define i32 @test1b() nounwind {
16entry:
17	ret i32 -1
18test_label:
19	br label %ret
20ret:
21	ret i32 -1
22}
23
24
25; Issues with referring to a label that gets RAUW'd later.
26define i32 @test2a() nounwind {
27entry:
28        %target = bitcast i8* blockaddress(@test2b, %test_label) to i8*
29
30        call i32 @test2b(i8* %target)
31
32        ret i32 0
33}
34
35define i32 @test2b(i8* %target) nounwind {
36entry:
37        indirectbr i8* %target, [label %test_label]
38
39test_label:
40; assume some code here...
41        br label %ret
42
43ret:
44        ret i32 -1
45}
46
47; Issues with a BB that gets RAUW'd to another one after references are
48; generated.
49define void @test3(i8** %P, i8** %Q) nounwind {
50entry:
51  store i8* blockaddress(@test3b, %test_label), i8** %P
52  store i8* blockaddress(@test3b, %ret), i8** %Q
53  ret void
54}
55
56define i32 @test3b() nounwind {
57entry:
58	br label %test_label
59test_label:
60	br label %ret
61ret:
62	ret i32 -1
63}
64
65
66; PR6673
67
68define i64 @test4a() {
69	%target = bitcast i8* blockaddress(@test4b, %usermain) to i8*
70	%ret = call i64 @test4b(i8* %target)
71
72	ret i64 %ret
73}
74
75define i64 @test4b(i8* %Code) {
76entry:
77	indirectbr i8* %Code, [label %usermain]
78usermain:
79	br label %label_line_0
80
81label_line_0:
82	br label %label_line_1
83
84label_line_1:
85	%target = ptrtoint i8* blockaddress(@test4b, %label_line_0) to i64
86	ret i64 %target
87}
88