Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt < %s -inline-threshold=0 -always-inline -S | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CALL
      2 ;
      3 ; Ensure the threshold has no impact on these decisions.
      4 ; RUN: opt < %s -inline-threshold=20000000 -always-inline -S | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CALL
      5 ; RUN: opt < %s -inline-threshold=-20000000 -always-inline -S | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-CALL
      6 ;
      7 ; The new pass manager doesn't re-use any threshold based infrastructure for
      8 ; the always inliner, but test that we get the correct result. The new PM
      9 ; always inliner also doesn't support inlining call-site alwaysinline
     10 ; annotations. It isn't clear that this is a reasonable use case for
     11 ; 'alwaysinline'.
     12 ; RUN: opt < %s -passes=always-inline -S | FileCheck %s --check-prefix=CHECK
     13 
     14 define internal i32 @inner1() alwaysinline {
     15 ; CHECK-NOT: @inner1(
     16   ret i32 1
     17 }
     18 define i32 @outer1() {
     19 ; CHECK-LABEL: @outer1(
     20 ; CHECK-NOT: call
     21 ; CHECK: ret
     22 
     23    %r = call i32 @inner1()
     24    ret i32 %r
     25 }
     26 
     27 ; The always inliner can't DCE arbitrary internal functions. PR2945
     28 define internal i32 @pr2945() nounwind {
     29 ; CHECK-LABEL: @pr2945(
     30   ret i32 0
     31 }
     32 
     33 define internal void @inner2(i32 %N) alwaysinline {
     34 ; CHECK-NOT: @inner2(
     35   %P = alloca i32, i32 %N
     36   ret void
     37 }
     38 define void @outer2(i32 %N) {
     39 ; The always inliner (unlike the normal one) should be willing to inline
     40 ; a function with a dynamic alloca into one without a dynamic alloca.
     41 ; rdar://6655932
     42 ;
     43 ; CHECK-LABEL: @outer2(
     44 ; CHECK-NOT: call void @inner2
     45 ; CHECK-NOT: call void @inner2
     46 ; CHECK: ret void
     47 
     48   call void @inner2( i32 %N )
     49   ret void
     50 }
     51 
     52 declare i32 @a() returns_twice
     53 declare i32 @b() returns_twice
     54 
     55 ; Cannot alwaysinline when that would introduce a returns_twice call.
     56 define internal i32 @inner3() alwaysinline {
     57 ; CHECK-LABEL: @inner3(
     58 entry:
     59   %call = call i32 @a() returns_twice
     60   %add = add nsw i32 1, %call
     61   ret i32 %add
     62 }
     63 define i32 @outer3() {
     64 entry:
     65 ; CHECK-LABEL: @outer3(
     66 ; CHECK-NOT: call i32 @a
     67 ; CHECK: ret
     68 
     69   %call = call i32 @inner3()
     70   %add = add nsw i32 1, %call
     71   ret i32 %add
     72 }
     73 
     74 define internal i32 @inner4() alwaysinline returns_twice {
     75 ; CHECK-NOT: @inner4(
     76 entry:
     77   %call = call i32 @b() returns_twice
     78   %add = add nsw i32 1, %call
     79   ret i32 %add
     80 }
     81 
     82 define i32 @outer4() {
     83 entry:
     84 ; CHECK-LABEL: @outer4(
     85 ; CHECK: call i32 @b()
     86 ; CHECK: ret
     87 
     88   %call = call i32 @inner4() returns_twice
     89   %add = add nsw i32 1, %call
     90   ret i32 %add
     91 }
     92 
     93 ; We can't inline this even though it has alwaysinline!
     94 define internal i32 @inner5(i8* %addr) alwaysinline {
     95 ; CHECK-LABEL: @inner5(
     96 entry:
     97   indirectbr i8* %addr, [ label %one, label %two ]
     98 
     99 one:
    100   ret i32 42
    101 
    102 two:
    103   ret i32 44
    104 }
    105 define i32 @outer5(i32 %x) {
    106 ; CHECK-LABEL: @outer5(
    107 ; CHECK: call i32 @inner5
    108 ; CHECK: ret
    109 
    110   %cmp = icmp slt i32 %x, 42
    111   %addr = select i1 %cmp, i8* blockaddress(@inner5, %one), i8* blockaddress(@inner5, %two)
    112   %call = call i32 @inner5(i8* %addr)
    113   ret i32 %call
    114 }
    115 
    116 ; We alwaysinline a function that call itself recursively.
    117 define internal void @inner6(i32 %x) alwaysinline {
    118 ; CHECK-LABEL: @inner6(
    119 entry:
    120   %icmp = icmp slt i32 %x, 0
    121   br i1 %icmp, label %return, label %bb
    122 
    123 bb:
    124   %sub = sub nsw i32 %x, 1
    125   call void @inner6(i32 %sub)
    126   ret void
    127 
    128 return:
    129   ret void
    130 }
    131 define void @outer6() {
    132 ; CHECK-LABEL: @outer6(
    133 ; CHECK: call void @inner6(i32 42)
    134 ; CHECK: ret
    135 
    136 entry:
    137   call void @inner6(i32 42)
    138   ret void
    139 }
    140 
    141 ; This is not an alwaysinline function and is actually external.
    142 define i32 @inner7() {
    143 ; CHECK-LABEL: @inner7(
    144   ret i32 1
    145 }
    146 define i32 @outer7() {
    147 ; CHECK-CALL-LABEL: @outer7(
    148 ; CHECK-CALL-NOT: call
    149 ; CHECK-CALL: ret
    150 
    151    %r = call i32 @inner7() alwaysinline
    152    ret i32 %r
    153 }
    154 
    155 define internal float* @inner8(float* nocapture align 128 %a) alwaysinline {
    156 ; CHECK-NOT: @inner8(
    157   ret float* %a
    158 }
    159 define float @outer8(float* nocapture %a) {
    160 ; CHECK-LABEL: @outer8(
    161 ; CHECK-NOT: call float* @inner8
    162 ; CHECK: ret
    163 
    164   %inner_a = call float* @inner8(float* %a)
    165   %f = load float, float* %inner_a, align 4
    166   ret float %f
    167 }
    168 
    169 
    170 ; The 'inner9*' and 'outer9' functions are designed to check that we remove
    171 ; a function that is inlined by the always inliner even when it is used by
    172 ; a complex constant expression prior to being inlined.
    173 
    174 ; The 'a' function gets used in a complex constant expression that, despite
    175 ; being constant folded, means it isn't dead. As a consequence it shouldn't be
    176 ; deleted. If it is, then the constant expression needs to become more complex
    177 ; to accurately test this scenario.
    178 define internal void @inner9a(i1 %b) alwaysinline {
    179 ; CHECK-LABEL: @inner9a(
    180 entry:
    181   ret void
    182 }
    183 
    184 define internal void @inner9b(i1 %b) alwaysinline {
    185 ; CHECK-NOT: @inner9b(
    186 entry:
    187   ret void
    188 }
    189 
    190 declare void @dummy9(i1 %b)
    191 
    192 define void @outer9() {
    193 ; CHECK-LABEL: @outer9(
    194 entry:
    195   ; First we use @inner9a in a complex constant expression that may get folded
    196   ; but won't get removed, and then we call it which will get inlined. Despite
    197   ; this the function can't be deleted because of the constant expression
    198   ; usage.
    199   %sink = alloca i1
    200   store volatile i1 icmp eq (i64 ptrtoint (void (i1)* @inner9a to i64), i64 ptrtoint(void (i1)* @dummy9 to i64)), i1* %sink
    201 ; CHECK: store volatile
    202   call void @inner9a(i1 false)
    203 ; CHECK-NOT: call void @inner9a
    204 
    205   ; Next we call @inner9b passing in a constant expression. This constant
    206   ; expression will in fact be removed by inlining, so we should also be able
    207   ; to delete the function.
    208   call void @inner9b(i1 icmp eq (i64 ptrtoint (void (i1)* @inner9b to i64), i64 ptrtoint(void (i1)* @dummy9 to i64)))
    209 ; CHECK-NOT: @inner9b
    210 
    211   ret void
    212 ; CHECK: ret void
    213 }
    214 
    215 ; The 'inner10' and 'outer10' functions test a frustrating consquence of the
    216 ; current 'alwaysinline' semantic model. Because such functions are allowed to
    217 ; be external functions, it may be necessary to both inline all of their uses
    218 ; and leave them in the final output. These tests can be removed if and when
    219 ; we restrict alwaysinline further.
    220 define void @inner10() alwaysinline {
    221 ; CHECK-LABEL: @inner10(
    222 entry:
    223   ret void
    224 }
    225 
    226 define void @outer10() {
    227 ; CHECK-LABEL: @outer10(
    228 entry:
    229   call void @inner10()
    230 ; CHECK-NOT: call void @inner10
    231 
    232   ret void
    233 ; CHECK: ret void
    234 }
    235 
    236 ; The 'inner11' and 'outer11' functions test another dimension of non-internal
    237 ; functions with alwaysinline. These functions use external linkages that we can
    238 ; actually remove safely and so we should.
    239 define linkonce void @inner11a() alwaysinline {
    240 ; CHECK-NOT: @inner11a(
    241 entry:
    242   ret void
    243 }
    244 
    245 define available_externally void @inner11b() alwaysinline {
    246 ; CHECK-NOT: @inner11b(
    247 entry:
    248   ret void
    249 }
    250 
    251 define void @outer11() {
    252 ; CHECK-LABEL: @outer11(
    253 entry:
    254   call void @inner11a()
    255   call void @inner11b()
    256 ; CHECK-NOT: call void @inner11a
    257 ; CHECK-NOT: call void @inner11b
    258 
    259   ret void
    260 ; CHECK: ret void
    261 }
    262 
    263 ; The 'inner12' and 'outer12' functions test that we don't remove functions
    264 ; which are part of a comdat group even if they otherwise seem dead.
    265 $comdat12 = comdat any
    266 
    267 define linkonce void @inner12() alwaysinline comdat($comdat12) {
    268 ; CHECK-LABEL: @inner12(
    269   ret void
    270 }
    271 
    272 define void @outer12() comdat($comdat12) {
    273 ; CHECK-LABEL: @outer12(
    274 entry:
    275   call void @inner12()
    276 ; CHECK-NOT: call void @inner12
    277 
    278   ret void
    279 ; CHECK: ret void
    280 }
    281 
    282 ; The 'inner13*' and 'outer13' functions test that we do remove functions
    283 ; which are part of a comdat group where all of the members are removed during
    284 ; always inlining.
    285 $comdat13 = comdat any
    286 
    287 define linkonce void @inner13a() alwaysinline comdat($comdat13) {
    288 ; CHECK-NOT: @inner13a(
    289   ret void
    290 }
    291 
    292 define linkonce void @inner13b() alwaysinline comdat($comdat13) {
    293 ; CHECK-NOT: @inner13b(
    294   ret void
    295 }
    296 
    297 define void @outer13() {
    298 ; CHECK-LABEL: @outer13(
    299 entry:
    300   call void @inner13a()
    301   call void @inner13b()
    302 ; CHECK-NOT: call void @inner13a
    303 ; CHECK-NOT: call void @inner13b
    304 
    305   ret void
    306 ; CHECK: ret void
    307 }
    308 
    309 define void @inner14() readnone nounwind {
    310 ; CHECK: define void @inner14
    311   ret void
    312 }
    313 
    314 define void @outer14() {
    315 ; CHECK: call void @inner14
    316   call void @inner14()
    317   ret void
    318 }
    319