Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt -inline -S < %s | FileCheck %s
      2 
      3 ; PR23216: We can't inline functions using llvm.localescape.
      4 
      5 declare void @llvm.localescape(...)
      6 declare i8* @llvm.frameaddress(i32)
      7 declare i8* @llvm.localrecover(i8*, i8*, i32)
      8 
      9 define internal void @foo(i8* %fp) {
     10   %a.i8 = call i8* @llvm.localrecover(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
     19   call void (...) @llvm.localescape(i32* %a)
     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
     30   call void (...) @llvm.localescape(i32* %a)
     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()
     45