Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt < %s -inline -S -inlinecold-threshold=25 | FileCheck %s
      2 ; Test that functions with attribute Cold are not inlined while the 
      3 ; same function without attribute Cold will be inlined.
      4 
      5 ; RUN: opt < %s -inline -S -inline-threshold=600 | FileCheck %s -check-prefix=OVERRIDE
      6 ; The command line argument for inline-threshold should override
      7 ; the default cold threshold, so a cold function with size bigger
      8 ; than the default cold threshold (225) will be inlined.
      9 
     10 ; RUN: opt < %s -inline -S | FileCheck %s -check-prefix=DEFAULT
     11 ; The same cold function will not be inlined with the default behavior.
     12 
     13 @a = global i32 4
     14 
     15 ; This function should be larger than the cold threshold (75), but smaller
     16 ; than the regular threshold.
     17 ; Function Attrs: nounwind readnone uwtable
     18 define i32 @simpleFunction(i32 %a) #0 {
     19 entry:
     20   call void @extern()
     21   %a1 = load volatile i32, i32* @a
     22   %x1 = add i32 %a1,  %a1
     23   %a2 = load volatile i32, i32* @a
     24   %x2 = add i32 %x1, %a2
     25   %a3 = load volatile i32, i32* @a
     26   %x3 = add i32 %x2, %a3
     27   %a4 = load volatile i32, i32* @a
     28   %x4 = add i32 %x3, %a4
     29   %a5 = load volatile i32, i32* @a
     30   %x5 = add i32 %x4, %a5
     31   %a6 = load volatile i32, i32* @a
     32   %x6 = add i32 %x5, %a6
     33   %a7 = load volatile i32, i32* @a
     34   %x7 = add i32 %x6, %a6
     35   %a8 = load volatile i32, i32* @a
     36   %x8 = add i32 %x7, %a8
     37   %a9 = load volatile i32, i32* @a
     38   %x9 = add i32 %x8, %a9
     39   %a10 = load volatile i32, i32* @a
     40   %x10 = add i32 %x9, %a10
     41   %a11 = load volatile i32, i32* @a
     42   %x11 = add i32 %x10, %a11
     43   %a12 = load volatile i32, i32* @a
     44   %x12 = add i32 %x11, %a12
     45   %add = add i32 %x12, %a
     46   ret i32 %add
     47 }
     48 
     49 ; Function Attrs: nounwind cold readnone uwtable
     50 define i32 @ColdFunction(i32 %a) #1 {
     51 ; CHECK-LABEL: @ColdFunction
     52 ; CHECK: ret
     53 ; OVERRIDE-LABEL: @ColdFunction
     54 ; OVERRIDE: ret
     55 ; DEFAULT-LABEL: @ColdFunction
     56 ; DEFAULT: ret
     57 entry:
     58   call void @extern()
     59   %a1 = load volatile i32, i32* @a
     60   %x1 = add i32 %a1,  %a1
     61   %a2 = load volatile i32, i32* @a
     62   %x2 = add i32 %x1, %a2
     63   %a3 = load volatile i32, i32* @a
     64   %x3 = add i32 %x2, %a3
     65   %a4 = load volatile i32, i32* @a
     66   %x4 = add i32 %x3, %a4
     67   %add = add i32 %x4, %a
     68   ret i32 %add
     69 }
     70 
     71 ; This function should be larger than the default cold threshold (225).
     72 define i32 @ColdFunction2(i32 %a) #1 {
     73 ; CHECK-LABEL: @ColdFunction2
     74 ; CHECK: ret
     75 ; OVERRIDE-LABEL: @ColdFunction2
     76 ; OVERRIDE: ret
     77 ; DEFAULT-LABEL: @ColdFunction2
     78 ; DEFAULT: ret
     79 entry:
     80   call void @extern()
     81   %a1 = load volatile i32, i32* @a
     82   %x1 = add i32 %a1,  %a1
     83   %a2 = load volatile i32, i32* @a
     84   %x2 = add i32 %x1, %a2
     85   %a3 = load volatile i32, i32* @a
     86   %x3 = add i32 %x2, %a3
     87   %a4 = load volatile i32, i32* @a
     88   %x4 = add i32 %x3, %a4
     89   %a5 = load volatile i32, i32* @a
     90   %x5 = add i32 %x4, %a5
     91   %a6 = load volatile i32, i32* @a
     92   %x6 = add i32 %x5, %a6
     93   %a7 = load volatile i32, i32* @a
     94   %x7 = add i32 %x6, %a7
     95   %a8 = load volatile i32, i32* @a
     96   %x8 = add i32 %x7, %a8
     97   %a9 = load volatile i32, i32* @a
     98   %x9 = add i32 %x8, %a9
     99   %a10 = load volatile i32, i32* @a
    100   %x10 = add i32 %x9, %a10
    101   %a11 = load volatile i32, i32* @a
    102   %x11 = add i32 %x10, %a11
    103   %a12 = load volatile i32, i32* @a
    104   %x12 = add i32 %x11, %a12
    105 
    106   %a21 = load volatile i32, i32* @a
    107   %x21 = add i32 %x12, %a21
    108   %a22 = load volatile i32, i32* @a
    109   %x22 = add i32 %x21, %a22
    110   %a23 = load volatile i32, i32* @a
    111   %x23 = add i32 %x22, %a23
    112   %a24 = load volatile i32, i32* @a
    113   %x24 = add i32 %x23, %a24
    114   %a25 = load volatile i32, i32* @a
    115   %x25 = add i32 %x24, %a25
    116   %a26 = load volatile i32, i32* @a
    117   %x26 = add i32 %x25, %a26
    118   %a27 = load volatile i32, i32* @a
    119   %x27 = add i32 %x26, %a27
    120   %a28 = load volatile i32, i32* @a
    121   %x28 = add i32 %x27, %a28
    122   %a29 = load volatile i32, i32* @a
    123   %x29 = add i32 %x28, %a29
    124   %a30 = load volatile i32, i32* @a
    125   %x30 = add i32 %x29, %a30
    126   %a31 = load volatile i32, i32* @a
    127   %x31 = add i32 %x30, %a31
    128   %a32 = load volatile i32, i32* @a
    129   %x32 = add i32 %x31, %a32
    130 
    131   %a41 = load volatile i32, i32* @a
    132   %x41 = add i32 %x32, %a41
    133   %a42 = load volatile i32, i32* @a
    134   %x42 = add i32 %x41, %a42
    135   %a43 = load volatile i32, i32* @a
    136   %x43 = add i32 %x42, %a43
    137   %a44 = load volatile i32, i32* @a
    138   %x44 = add i32 %x43, %a44
    139   %a45 = load volatile i32, i32* @a
    140   %x45 = add i32 %x44, %a45
    141   %a46 = load volatile i32, i32* @a
    142   %x46 = add i32 %x45, %a46
    143   %a47 = load volatile i32, i32* @a
    144   %x47 = add i32 %x46, %a47
    145   %a48 = load volatile i32, i32* @a
    146   %x48 = add i32 %x47, %a48
    147   %a49 = load volatile i32, i32* @a
    148   %x49 = add i32 %x48, %a49
    149   %a50 = load volatile i32, i32* @a
    150   %x50 = add i32 %x49, %a50
    151   %a51 = load volatile i32, i32* @a
    152   %x51 = add i32 %x50, %a51
    153   %a52 = load volatile i32, i32* @a
    154   %x52 = add i32 %x51, %a52
    155 
    156   %add = add i32 %x52, %a
    157   ret i32 %add
    158 }
    159 
    160 ; Function Attrs: nounwind readnone uwtable
    161 define i32 @bar(i32 %a) #0 {
    162 ; CHECK-LABEL: @bar
    163 ; CHECK: call i32 @ColdFunction(i32 5)
    164 ; CHECK-NOT: call i32 @simpleFunction(i32 6)
    165 ; CHECK: call i32 @ColdFunction2(i32 5)
    166 ; CHECK: ret
    167 ; OVERRIDE-LABEL: @bar
    168 ; OVERRIDE-NOT: call i32 @ColdFunction(i32 5)
    169 ; OVERRIDE-NOT: call i32 @simpleFunction(i32 6)
    170 ; OVERRIDE-NOT: call i32 @ColdFunction2(i32 5)
    171 ; OVERRIDE: ret
    172 ; DEFAULT-LABEL: @bar
    173 ; DEFAULT-NOT: call i32 @ColdFunction(i32 5)
    174 ; DEFAULT-NOT: call i32 @simpleFunction(i32 6)
    175 ; DEFAULT: call i32 @ColdFunction2(i32 5)
    176 ; DEFAULT: ret
    177 entry:
    178   %0 = tail call i32 @ColdFunction(i32 5)
    179   %1 = tail call i32 @simpleFunction(i32 6)
    180   %2 = tail call i32 @ColdFunction2(i32 5)
    181   %3 = add i32 %0, %1
    182   %add = add i32 %2, %3
    183   ret i32 %add
    184 }
    185 
    186 declare void @extern()
    187 attributes #0 = { nounwind readnone uwtable }
    188 attributes #1 = { nounwind cold readnone uwtable }
    189