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