1; RUN: opt < %s -inline -S -inlinecold-threshold=75 | 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 18define i32 @simpleFunction(i32 %a) #0 { 19entry: 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 50define 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 57entry: 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 %a5 = load volatile i32, i32* @a 68 %x5 = add i32 %x4, %a5 69 %a6 = load volatile i32, i32* @a 70 %x6 = add i32 %x5, %a6 71 %a7 = load volatile i32, i32* @a 72 %x7 = add i32 %x6, %a6 73 %a8 = load volatile i32, i32* @a 74 %x8 = add i32 %x7, %a8 75 %a9 = load volatile i32, i32* @a 76 %x9 = add i32 %x8, %a9 77 %a10 = load volatile i32, i32* @a 78 %x10 = add i32 %x9, %a10 79 %a11 = load volatile i32, i32* @a 80 %x11 = add i32 %x10, %a11 81 %a12 = load volatile i32, i32* @a 82 %x12 = add i32 %x11, %a12 83 %add = add i32 %x12, %a 84 ret i32 %add 85} 86 87; This function should be larger than the default cold threshold (225). 88define i32 @ColdFunction2(i32 %a) #1 { 89; CHECK-LABEL: @ColdFunction2 90; CHECK: ret 91; OVERRIDE-LABEL: @ColdFunction2 92; OVERRIDE: ret 93; DEFAULT-LABEL: @ColdFunction2 94; DEFAULT: ret 95entry: 96 call void @extern() 97 %a1 = load volatile i32, i32* @a 98 %x1 = add i32 %a1, %a1 99 %a2 = load volatile i32, i32* @a 100 %x2 = add i32 %x1, %a2 101 %a3 = load volatile i32, i32* @a 102 %x3 = add i32 %x2, %a3 103 %a4 = load volatile i32, i32* @a 104 %x4 = add i32 %x3, %a4 105 %a5 = load volatile i32, i32* @a 106 %x5 = add i32 %x4, %a5 107 %a6 = load volatile i32, i32* @a 108 %x6 = add i32 %x5, %a6 109 %a7 = load volatile i32, i32* @a 110 %x7 = add i32 %x6, %a7 111 %a8 = load volatile i32, i32* @a 112 %x8 = add i32 %x7, %a8 113 %a9 = load volatile i32, i32* @a 114 %x9 = add i32 %x8, %a9 115 %a10 = load volatile i32, i32* @a 116 %x10 = add i32 %x9, %a10 117 %a11 = load volatile i32, i32* @a 118 %x11 = add i32 %x10, %a11 119 %a12 = load volatile i32, i32* @a 120 %x12 = add i32 %x11, %a12 121 122 %a21 = load volatile i32, i32* @a 123 %x21 = add i32 %x12, %a21 124 %a22 = load volatile i32, i32* @a 125 %x22 = add i32 %x21, %a22 126 %a23 = load volatile i32, i32* @a 127 %x23 = add i32 %x22, %a23 128 %a24 = load volatile i32, i32* @a 129 %x24 = add i32 %x23, %a24 130 %a25 = load volatile i32, i32* @a 131 %x25 = add i32 %x24, %a25 132 %a26 = load volatile i32, i32* @a 133 %x26 = add i32 %x25, %a26 134 %a27 = load volatile i32, i32* @a 135 %x27 = add i32 %x26, %a27 136 %a28 = load volatile i32, i32* @a 137 %x28 = add i32 %x27, %a28 138 %a29 = load volatile i32, i32* @a 139 %x29 = add i32 %x28, %a29 140 %a30 = load volatile i32, i32* @a 141 %x30 = add i32 %x29, %a30 142 %a31 = load volatile i32, i32* @a 143 %x31 = add i32 %x30, %a31 144 %a32 = load volatile i32, i32* @a 145 %x32 = add i32 %x31, %a32 146 147 %a41 = load volatile i32, i32* @a 148 %x41 = add i32 %x32, %a41 149 %a42 = load volatile i32, i32* @a 150 %x42 = add i32 %x41, %a42 151 %a43 = load volatile i32, i32* @a 152 %x43 = add i32 %x42, %a43 153 %a44 = load volatile i32, i32* @a 154 %x44 = add i32 %x43, %a44 155 %a45 = load volatile i32, i32* @a 156 %x45 = add i32 %x44, %a45 157 %a46 = load volatile i32, i32* @a 158 %x46 = add i32 %x45, %a46 159 %a47 = load volatile i32, i32* @a 160 %x47 = add i32 %x46, %a47 161 %a48 = load volatile i32, i32* @a 162 %x48 = add i32 %x47, %a48 163 %a49 = load volatile i32, i32* @a 164 %x49 = add i32 %x48, %a49 165 %a50 = load volatile i32, i32* @a 166 %x50 = add i32 %x49, %a50 167 %a51 = load volatile i32, i32* @a 168 %x51 = add i32 %x50, %a51 169 %a52 = load volatile i32, i32* @a 170 %x52 = add i32 %x51, %a52 171 172 %add = add i32 %x52, %a 173 ret i32 %add 174} 175 176; Function Attrs: nounwind readnone uwtable 177define i32 @bar(i32 %a) #0 { 178; CHECK-LABEL: @bar 179; CHECK: call i32 @ColdFunction(i32 5) 180; CHECK-NOT: call i32 @simpleFunction(i32 6) 181; CHECK: call i32 @ColdFunction2(i32 5) 182; CHECK: ret 183; OVERRIDE-LABEL: @bar 184; OVERRIDE-NOT: call i32 @ColdFunction(i32 5) 185; OVERRIDE-NOT: call i32 @simpleFunction(i32 6) 186; OVERRIDE-NOT: call i32 @ColdFunction2(i32 5) 187; OVERRIDE: ret 188; DEFAULT-LABEL: @bar 189; DEFAULT-NOT: call i32 @ColdFunction(i32 5) 190; DEFAULT-NOT: call i32 @simpleFunction(i32 6) 191; DEFAULT: call i32 @ColdFunction2(i32 5) 192; DEFAULT: ret 193entry: 194 %0 = tail call i32 @ColdFunction(i32 5) 195 %1 = tail call i32 @simpleFunction(i32 6) 196 %2 = tail call i32 @ColdFunction2(i32 5) 197 %3 = add i32 %0, %1 198 %add = add i32 %2, %3 199 ret i32 %add 200} 201 202declare void @extern() 203attributes #0 = { nounwind readnone uwtable } 204attributes #1 = { nounwind cold readnone uwtable } 205