Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt < %s -inline -S | FileCheck %s
      2 
      3 ; We have to apply the less restrictive TailCallKind of the call site being
      4 ; inlined and any call sites cloned into the caller.
      5 
      6 ; No tail marker after inlining, since test_capture_c captures an alloca.
      7 ; CHECK: define void @test_capture_a(
      8 ; CHECK-NOT: tail
      9 ; CHECK: call void @test_capture_c(
     10 
     11 declare void @test_capture_c(i32*)
     12 define internal void @test_capture_b(i32* %P) {
     13   tail call void @test_capture_c(i32* %P)
     14   ret void
     15 }
     16 define void @test_capture_a() {
     17   %A = alloca i32  		; captured by test_capture_b
     18   call void @test_capture_b(i32* %A)
     19   ret void
     20 }
     21 
     22 ; No musttail marker after inlining, since the prototypes don't match.
     23 ; CHECK: define void @test_proto_mismatch_a(
     24 ; CHECK-NOT: musttail
     25 ; CHECK: call void @test_proto_mismatch_c(
     26 
     27 declare void @test_proto_mismatch_c(i32*)
     28 define internal void @test_proto_mismatch_b(i32* %p) {
     29   musttail call void @test_proto_mismatch_c(i32* %p)
     30   ret void
     31 }
     32 define void @test_proto_mismatch_a() {
     33   call void @test_proto_mismatch_b(i32* null)
     34   ret void
     35 }
     36 
     37 ; After inlining through a musttail call site, we need to keep musttail markers
     38 ; to prevent unbounded stack growth.
     39 ; CHECK: define void @test_musttail_basic_a(
     40 ; CHECK: musttail call void @test_musttail_basic_c(
     41 
     42 declare void @test_musttail_basic_c(i32* %p)
     43 define internal void @test_musttail_basic_b(i32* %p) {
     44   musttail call void @test_musttail_basic_c(i32* %p)
     45   ret void
     46 }
     47 define void @test_musttail_basic_a(i32* %p) {
     48   musttail call void @test_musttail_basic_b(i32* %p)
     49   ret void
     50 }
     51 
     52 ; Don't insert lifetime end markers here, the lifetime is trivially over due
     53 ; the return.
     54 ; CHECK: define void @test_byval_a(
     55 ; CHECK: musttail call void @test_byval_c(
     56 ; CHECK-NEXT: ret void
     57 
     58 declare void @test_byval_c(i32* byval %p)
     59 define internal void @test_byval_b(i32* byval %p) {
     60   musttail call void @test_byval_c(i32* byval %p)
     61   ret void
     62 }
     63 define void @test_byval_a(i32* byval %p) {
     64   musttail call void @test_byval_b(i32* byval %p)
     65   ret void
     66 }
     67 
     68 ; Don't insert a stack restore, we're about to return.
     69 ; CHECK: define void @test_dynalloca_a(
     70 ; CHECK: call i8* @llvm.stacksave(
     71 ; CHECK: alloca i8, i32 %n
     72 ; CHECK: musttail call void @test_dynalloca_c(
     73 ; CHECK-NEXT: ret void
     74 
     75 declare void @escape(i8* %buf)
     76 declare void @test_dynalloca_c(i32* byval %p, i32 %n)
     77 define internal void @test_dynalloca_b(i32* byval %p, i32 %n) alwaysinline {
     78   %buf = alloca i8, i32 %n              ; dynamic alloca
     79   call void @escape(i8* %buf)           ; escape it
     80   musttail call void @test_dynalloca_c(i32* byval %p, i32 %n)
     81   ret void
     82 }
     83 define void @test_dynalloca_a(i32* byval %p, i32 %n) {
     84   musttail call void @test_dynalloca_b(i32* byval %p, i32 %n)
     85   ret void
     86 }
     87 
     88 ; We can't merge the returns.
     89 ; CHECK: define void @test_multiret_a(
     90 ; CHECK: musttail call void @test_multiret_c(
     91 ; CHECK-NEXT: ret void
     92 ; CHECK: musttail call void @test_multiret_d(
     93 ; CHECK-NEXT: ret void
     94 
     95 declare void @test_multiret_c(i1 zeroext %b)
     96 declare void @test_multiret_d(i1 zeroext %b)
     97 define internal void @test_multiret_b(i1 zeroext %b) {
     98   br i1 %b, label %c, label %d
     99 c:
    100   musttail call void @test_multiret_c(i1 zeroext %b)
    101   ret void
    102 d:
    103   musttail call void @test_multiret_d(i1 zeroext %b)
    104   ret void
    105 }
    106 define void @test_multiret_a(i1 zeroext %b) {
    107   musttail call void @test_multiret_b(i1 zeroext %b)
    108   ret void
    109 }
    110 
    111 ; We have to avoid bitcast chains.
    112 ; CHECK: define i32* @test_retptr_a(
    113 ; CHECK: musttail call i8* @test_retptr_c(
    114 ; CHECK-NEXT: bitcast i8* {{.*}} to i32*
    115 ; CHECK-NEXT: ret i32*
    116 
    117 declare i8* @test_retptr_c()
    118 define internal i16* @test_retptr_b() {
    119   %rv = musttail call i8* @test_retptr_c()
    120   %v = bitcast i8* %rv to i16*
    121   ret i16* %v
    122 }
    123 define i32* @test_retptr_a() {
    124   %rv = musttail call i16* @test_retptr_b()
    125   %v = bitcast i16* %rv to i32*
    126   ret i32* %v
    127 }
    128 
    129 ; Combine the last two cases: multiple returns with pointer bitcasts.
    130 ; CHECK: define i32* @test_multiptrret_a(
    131 ; CHECK: musttail call i8* @test_multiptrret_c(
    132 ; CHECK-NEXT: bitcast i8* {{.*}} to i32*
    133 ; CHECK-NEXT: ret i32*
    134 ; CHECK: musttail call i8* @test_multiptrret_d(
    135 ; CHECK-NEXT: bitcast i8* {{.*}} to i32*
    136 ; CHECK-NEXT: ret i32*
    137 
    138 declare i8* @test_multiptrret_c(i1 zeroext %b)
    139 declare i8* @test_multiptrret_d(i1 zeroext %b)
    140 define internal i16* @test_multiptrret_b(i1 zeroext %b) {
    141   br i1 %b, label %c, label %d
    142 c:
    143   %c_rv = musttail call i8* @test_multiptrret_c(i1 zeroext %b)
    144   %c_v = bitcast i8* %c_rv to i16*
    145   ret i16* %c_v
    146 d:
    147   %d_rv = musttail call i8* @test_multiptrret_d(i1 zeroext %b)
    148   %d_v = bitcast i8* %d_rv to i16*
    149   ret i16* %d_v
    150 }
    151 define i32* @test_multiptrret_a(i1 zeroext %b) {
    152   %rv = musttail call i16* @test_multiptrret_b(i1 zeroext %b)
    153   %v = bitcast i16* %rv to i32*
    154   ret i32* %v
    155 }
    156 
    157 ; Inline a musttail call site which contains a normal return and a musttail call.
    158 ; CHECK: define i32 @test_mixedret_a(
    159 ; CHECK: br i1 %b
    160 ; CHECK: musttail call i32 @test_mixedret_c(
    161 ; CHECK-NEXT: ret i32
    162 ; CHECK: call i32 @test_mixedret_d(i1 zeroext %b)
    163 ; CHECK: add i32 1,
    164 ; CHECK-NOT: br
    165 ; CHECK: ret i32
    166 
    167 declare i32 @test_mixedret_c(i1 zeroext %b)
    168 declare i32 @test_mixedret_d(i1 zeroext %b)
    169 define internal i32 @test_mixedret_b(i1 zeroext %b) {
    170   br i1 %b, label %c, label %d
    171 c:
    172   %c_rv = musttail call i32 @test_mixedret_c(i1 zeroext %b)
    173   ret i32 %c_rv
    174 d:
    175   %d_rv = call i32 @test_mixedret_d(i1 zeroext %b)
    176   %d_rv1 = add i32 1, %d_rv
    177   ret i32 %d_rv1
    178 }
    179 define i32 @test_mixedret_a(i1 zeroext %b) {
    180   %rv = musttail call i32 @test_mixedret_b(i1 zeroext %b)
    181   ret i32 %rv
    182 }
    183