1; RUN: opt -inline -S < %s | FileCheck %s
2; RUN: opt -passes='cgscc(inline)' -S < %s | FileCheck %s
3; PR10162
4
5; Make sure doit is not inlined since the blockaddress is taken
6; which could be unsafe
7; CHECK: store i8* blockaddress(@doit, %here), i8** %pptr, align 8
8
9@i = global i32 1, align 4
10@ptr1 = common global i8* null, align 8
11
12define void @doit(i8** nocapture %pptr, i32 %cond) nounwind uwtable {
13entry:
14  %tobool = icmp eq i32 %cond, 0
15  br i1 %tobool, label %if.end, label %here
16
17here:
18  store i8* blockaddress(@doit, %here), i8** %pptr, align 8
19  br label %if.end
20
21if.end:
22  ret void
23}
24
25define void @f(i32 %cond) nounwind uwtable {
26entry:
27  call void @doit(i8** @ptr1, i32 %cond)
28  ret void
29}
30
31; PR27233: We can inline @run into @init.  Don't crash on it.
32;
33; CHECK-LABEL: define void @init
34; CHECK:         store i8* blockaddress(@run, %bb)
35; CHECK-SAME:        @run.bb
36define void @init() {
37entry:
38  call void @run()
39  ret void
40}
41
42define void @run() {
43entry:
44  store i8* blockaddress(@run, %bb), i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @run.bb, i64 0, i64 0), align 8
45  ret void
46
47bb:
48  unreachable
49}
50
51@run.bb = global [1 x i8*] zeroinitializer
52