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