| Reid Kleckner | 223de26 | 2015-04-14 20:38:14 +0000 | [diff] [blame] | 1 | ; RUN: opt -inline -S < %s | FileCheck %s | 
|  | 2 |  | 
|  | 3 | ; PR23216: We can't inline functions using llvm.frameescape. | 
|  | 4 |  | 
|  | 5 | declare void @llvm.frameescape(...) | 
|  | 6 | declare i8* @llvm.frameaddress(i32) | 
|  | 7 | declare i8* @llvm.framerecover(i8*, i8*, i32) | 
|  | 8 |  | 
|  | 9 | define internal void @foo(i8* %fp) { | 
|  | 10 | %a.i8 = call i8* @llvm.framerecover(i8* bitcast (i32 ()* @bar to i8*), i8* %fp, i32 0) | 
|  | 11 | %a = bitcast i8* %a.i8 to i32* | 
|  | 12 | store i32 42, i32* %a | 
|  | 13 | ret void | 
|  | 14 | } | 
|  | 15 |  | 
|  | 16 | define internal i32 @bar() { | 
|  | 17 | entry: | 
|  | 18 | %a = alloca i32 | 
| David Blaikie | 23af648 | 2015-04-16 23:24:18 +0000 | [diff] [blame] | 19 | call void (...) @llvm.frameescape(i32* %a) | 
| Reid Kleckner | 223de26 | 2015-04-14 20:38:14 +0000 | [diff] [blame] | 20 | %fp = call i8* @llvm.frameaddress(i32 0) | 
|  | 21 | tail call void @foo(i8* %fp) | 
|  | 22 | %r = load i32, i32* %a | 
|  | 23 | ret i32 %r | 
|  | 24 | } | 
|  | 25 |  | 
|  | 26 | ; We even bail when someone marks it alwaysinline. | 
|  | 27 | define internal i32 @bar_alwaysinline() alwaysinline { | 
|  | 28 | entry: | 
|  | 29 | %a = alloca i32 | 
| David Blaikie | 23af648 | 2015-04-16 23:24:18 +0000 | [diff] [blame] | 30 | call void (...) @llvm.frameescape(i32* %a) | 
| Reid Kleckner | 223de26 | 2015-04-14 20:38:14 +0000 | [diff] [blame] | 31 | tail call void @foo(i8* null) | 
|  | 32 | ret i32 0 | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | define i32 @bazz() { | 
|  | 36 | entry: | 
|  | 37 | %r = tail call i32 @bar() | 
|  | 38 | %r1 = tail call i32 @bar_alwaysinline() | 
|  | 39 | ret i32 %r | 
|  | 40 | } | 
|  | 41 |  | 
|  | 42 | ; CHECK: define i32 @bazz() | 
|  | 43 | ; CHECK: call i32 @bar() | 
|  | 44 | ; CHECK: call i32 @bar_alwaysinline() |