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