xref: /llvm-project/llvm/test/CodeGen/Generic/addr-label.ll (revision d4af8965725929e4364377a3e5d8d3d5053d46f0)
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: target=nvptx{{.*}}
8
9; The behavior of this test is not well defined. On PowerPC the test may pass
10; or fail depending on the order in which the test functions are processed by
11; llc.
12; UNSUPPORTED: target=powerpc{{.*}}
13
14;; Reference to a label that gets deleted.
15define ptr @test1() nounwind {
16entry:
17	ret ptr blockaddress(@test1b, %test_label)
18}
19
20define i32 @test1b() nounwind {
21entry:
22	ret i32 -1
23test_label:
24	br label %ret
25ret:
26	ret i32 -1
27}
28
29
30; Issues with referring to a label that gets RAUW'd later.
31define i32 @test2a() nounwind {
32entry:
33        %target = bitcast ptr blockaddress(@test2b, %test_label) to ptr
34
35        call i32 @test2b(ptr %target)
36
37        ret i32 0
38}
39
40define i32 @test2b(ptr %target) nounwind {
41entry:
42        indirectbr ptr %target, [label %test_label]
43
44test_label:
45; assume some code here...
46        br label %ret
47
48ret:
49        ret i32 -1
50}
51
52; Issues with a BB that gets RAUW'd to another one after references are
53; generated.
54define void @test3(ptr %P, ptr %Q) nounwind {
55entry:
56  store ptr blockaddress(@test3b, %test_label), ptr %P
57  store ptr blockaddress(@test3b, %ret), ptr %Q
58  ret void
59}
60
61define i32 @test3b() nounwind {
62entry:
63	br label %test_label
64test_label:
65	br label %ret
66ret:
67	ret i32 -1
68}
69
70
71; PR6673
72
73define i64 @test4a() {
74	%target = bitcast ptr blockaddress(@test4b, %usermain) to ptr
75	%ret = call i64 @test4b(ptr %target)
76
77	ret i64 %ret
78}
79
80define i64 @test4b(ptr %Code) {
81entry:
82	indirectbr ptr %Code, [label %usermain]
83usermain:
84	br label %label_line_0
85
86label_line_0:
87	br label %label_line_1
88
89label_line_1:
90	%target = ptrtoint ptr blockaddress(@test4b, %label_line_0) to i64
91	ret i64 %target
92}
93