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