xref: /aosp_15_r20/external/llvm/test/Transforms/Inline/frameescape.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -inline -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; PR23216: We can't inline functions using llvm.localescape.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.localescape(...)
6*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.frameaddress(i32)
7*9880d681SAndroid Build Coastguard Workerdeclare i8* @llvm.localrecover(i8*, i8*, i32)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine internal void @foo(i8* %fp) {
10*9880d681SAndroid Build Coastguard Worker  %a.i8 = call i8* @llvm.localrecover(i8* bitcast (i32 ()* @bar to i8*), i8* %fp, i32 0)
11*9880d681SAndroid Build Coastguard Worker  %a = bitcast i8* %a.i8 to i32*
12*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %a
13*9880d681SAndroid Build Coastguard Worker  ret void
14*9880d681SAndroid Build Coastguard Worker}
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine internal i32 @bar() {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %a = alloca i32
19*9880d681SAndroid Build Coastguard Worker  call void (...) @llvm.localescape(i32* %a)
20*9880d681SAndroid Build Coastguard Worker  %fp = call i8* @llvm.frameaddress(i32 0)
21*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i8* %fp)
22*9880d681SAndroid Build Coastguard Worker  %r = load i32, i32* %a
23*9880d681SAndroid Build Coastguard Worker  ret i32 %r
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; We even bail when someone marks it alwaysinline.
27*9880d681SAndroid Build Coastguard Workerdefine internal i32 @bar_alwaysinline() alwaysinline {
28*9880d681SAndroid Build Coastguard Workerentry:
29*9880d681SAndroid Build Coastguard Worker  %a = alloca i32
30*9880d681SAndroid Build Coastguard Worker  call void (...) @llvm.localescape(i32* %a)
31*9880d681SAndroid Build Coastguard Worker  tail call void @foo(i8* null)
32*9880d681SAndroid Build Coastguard Worker  ret i32 0
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i32 @bazz() {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  %r = tail call i32 @bar()
38*9880d681SAndroid Build Coastguard Worker  %r1 = tail call i32 @bar_alwaysinline()
39*9880d681SAndroid Build Coastguard Worker  ret i32 %r
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK: define i32 @bazz()
43*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @bar()
44*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @bar_alwaysinline()
45