1; REQUIRES: asserts 2; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -enable-ext-tsp-block-placement=1 -ext-tsp-chain-split-threshold=128 -debug-only=block-placement < %s 2>&1 | FileCheck %s 3; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -enable-ext-tsp-block-placement=1 -ext-tsp-chain-split-threshold=1 -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK2 4; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -enable-ext-tsp-block-placement=0 -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK3 5 6@yydebug = dso_local global i32 0, align 4 7 8define void @func_large() !prof !0 { 9; A largee CFG instance where chain splitting helps to 10; compute a better basic block ordering. The test verifies that with chain 11; splitting, the resulting layout is improved (e.g., the score is increased). 12; 13; +----------------+ 14; | b0 [76 bytes] | -------------------+ 15; +----------------+ | 16; | | 17; | 3,065,981,778 | 18; v | 19; +----------------+ 766,495,444 +----------------+ | 20; | b8 [244 bytes] | <--------------- | b2 [4 bytes] | | 21; +----------------+ +----------------+ | 22; | ^ | | 23; | | | 2,299,486,333 | 24; | | 766,495,444 v | 25; | | +----------------+ | 26; | +----------------------- | b3 [12 bytes] | | 27; | +----------------+ | 28; | | | 29; | | 1,532,990,888 | 30; | v | 31; | +----------------+ | 574,869,946 32; | +-------------- | b4 [12 bytes] | | 33; | | +----------------+ | 34; | | | | 35; | | | 574,871,583 | 36; | | v | 37; | | +----------------+ | 38; | | | b5 [116 bytes] | -+ | 39; | | +----------------+ | | 40; | | | | | 41; | | | 1,636 | | 42; | | v | | 43; | | +----------------+ | | 44; | | +------ | b6 [32 bytes] | | | 45; | | | +----------------+ | | 46; | | | | | | 47; | | | | 7 | 3,065,981,778 | 48; | | | v | | 49; | | | +----------------+ | | 50; | | | 1,628 | b9 [16 bytes] | | | 51; | | | +----------------+ | | 52; | | | | | | 53; | | | | 7 | | 54; | | | v | | 55; | | | +----------------+ | | 56; | | +-----> | b7 [12 bytes] | | | 57; | | +----------------+ | | 58; | | | | | 59; | | 958,119,305 | 1,636 | | 60; | | v v v 61; | | +------------------------------------------+ 62; | +-------------> | | 63; | 1,532,990,889 | b1 [36 bytes] | 64; +-------------------------------> | | 65; +------------------------------------------+ 66; 67; An expected output with a large chain-split-threshold -- the layout score is 68; increased by ~17% 69; 70; CHECK-LABEL: Applying ext-tsp layout 71; CHECK: original layout score: 9171074274.27 72; CHECK: optimized layout score: 10756755324.57 73; CHECK: b0 74; CHECK: b2 75; CHECK: b3 76; CHECK: b4 77; CHECK: b5 78; CHECK: b8 79; CHECK: b1 80; CHECK: b6 81; CHECK: b7 82; CHECK: b9 83; 84; An expected output with chain-split-threshold=1 (disabling splitting) -- the 85; increase of the layout score is smaller, ~7%: 86; 87; CHECK2-LABEL: Applying ext-tsp layout 88; CHECK2: original layout score: 9171074274.27 89; CHECK2: optimized layout score: 9810644873.57 90; CHECK2: b0 91; CHECK2: b2 92; CHECK2: b3 93; CHECK2: b4 94; CHECK2: b5 95; CHECK2: b1 96; CHECK2: b8 97; CHECK2: b6 98; CHECK2: b7 99; CHECK2: b9 100; 101; An expected output with ext-tsp disabled -- the layout is not modified: 102; 103; CHECK3-LABEL: func_large: 104; CHECK3: b0 105; CHECK3: b1 106; CHECK3: b2 107; CHECK3: b3 108; CHECK3: b4 109; CHECK3: b5 110; CHECK3: b6 111; CHECK3: b7 112; CHECK3: b8 113; CHECK3: b9 114 115b0: 116 %0 = load i32, ptr @yydebug, align 4 117 %cmp = icmp ne i32 %0, 0 118 call void @a() 119 call void @a() 120 call void @a() 121 call void @a() 122 call void @a() 123 call void @a() 124 call void @a() 125 call void @a() 126 call void @a() 127 call void @a() 128 call void @a() 129 call void @a() 130 call void @a() 131 call void @a() 132 call void @a() 133 call void @a() 134 call void @a() 135 call void @a() 136 br i1 %cmp, label %b1, label %b2, !prof !1 137b1: 138 call void @b() 139 call void @b() 140 call void @b() 141 call void @b() 142 call void @b() 143 call void @b() 144 call void @b() 145 call void @b() 146 ret void 147b2: 148 call void @c() 149 call void @c() 150 call void @c() 151 call void @c() 152 call void @c() 153 call void @c() 154 call void @c() 155 call void @c() 156 call void @c() 157 call void @c() 158 br i1 %cmp, label %b3, label %b8, !prof !2 159b3: 160 call void @d() 161 call void @d() 162 br i1 %cmp, label %b4, label %b8, !prof !3 163b4: 164 call void @e() 165 call void @e() 166 br i1 %cmp, label %b5, label %b1, !prof !4 167b5: 168 call void @f() 169 call void @f() 170 call void @f() 171 call void @f() 172 call void @f() 173 call void @f() 174 call void @f() 175 call void @f() 176 call void @f() 177 call void @f() 178 call void @f() 179 call void @f() 180 call void @f() 181 call void @f() 182 call void @f() 183 call void @f() 184 call void @f() 185 call void @f() 186 call void @f() 187 call void @f() 188 call void @f() 189 call void @f() 190 call void @f() 191 call void @f() 192 call void @f() 193 call void @f() 194 call void @f() 195 call void @f() 196 br i1 %cmp, label %b1, label %b6, !prof !5 197b6: 198 call void @g() 199 call void @g() 200 call void @g() 201 call void @g() 202 call void @g() 203 call void @g() 204 call void @g() 205 br i1 %cmp, label %b7, label %b9, !prof !6 206b7: 207 call void @h() 208 call void @h() 209 br label %b1 210b8: 211 call void @i() 212 call void @i() 213 call void @i() 214 call void @i() 215 call void @i() 216 call void @i() 217 call void @i() 218 call void @i() 219 call void @i() 220 call void @i() 221 call void @i() 222 call void @i() 223 call void @i() 224 call void @i() 225 call void @i() 226 call void @i() 227 call void @i() 228 call void @i() 229 call void @i() 230 call void @i() 231 call void @i() 232 call void @i() 233 call void @i() 234 call void @i() 235 call void @i() 236 call void @i() 237 call void @i() 238 call void @i() 239 call void @i() 240 call void @i() 241 call void @i() 242 call void @i() 243 call void @i() 244 call void @i() 245 call void @i() 246 call void @i() 247 call void @i() 248 call void @i() 249 call void @i() 250 call void @i() 251 call void @i() 252 call void @i() 253 call void @i() 254 call void @i() 255 call void @i() 256 call void @i() 257 call void @i() 258 call void @i() 259 call void @i() 260 call void @i() 261 call void @i() 262 call void @i() 263 call void @i() 264 call void @i() 265 call void @i() 266 call void @i() 267 call void @i() 268 call void @i() 269 call void @i() 270 call void @i() 271 br label %b1 272b9: 273 call void @j() 274 call void @j() 275 call void @j() 276 br label %b7 277} 278 279 280declare void @a() 281declare void @b() 282declare void @c() 283declare void @d() 284declare void @e() 285declare void @f() 286declare void @g() 287declare void @h() 288declare void @i() 289declare void @j() 290 291!0 = !{!"function_entry_count", i64 6131963556} 292!1 = !{!"branch_weights", i32 3065981778, i32 3065981778} 293!2 = !{!"branch_weights", i32 2299486333, i32 766495444} 294!3 = !{!"branch_weights", i32 1532990888, i32 766495444} 295!4 = !{!"branch_weights", i32 574871583, i32 958119305} 296!5 = !{!"branch_weights", i32 574869946, i32 1636} 297!6 = !{!"branch_weights", i32 1628, i32 7} 298