312 lines · plain
1; REQUIRES: asserts2; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -enable-ext-tsp-block-placement -ext-tsp-chain-split-threshold=128 -debug-only=block-placement < %s 2>&1 | FileCheck %s3; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -enable-ext-tsp-block-placement -ext-tsp-chain-split-threshold=1 -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK24; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK35; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -enable-ext-tsp-block-placement -ext-tsp-block-placement-max-blocks=8 -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK46 7@yydebug = dso_local global i32 0, align 48 9define void @func_large() !prof !0 {10; A large CFG instance where chain splitting helps to11; compute a better basic block ordering. The test verifies that with chain12; splitting, the resulting layout is improved (e.g., the score is increased).13;14; +----------------+15; | b0 [76 bytes] | -------------------+16; +----------------+ |17; | |18; | 3,065,981,778 |19; v |20; +----------------+ 766,495,444 +----------------+ |21; | b8 [244 bytes] | <--------------- | b2 [4 bytes] | |22; +----------------+ +----------------+ |23; | ^ | |24; | | | 2,299,486,333 |25; | | 766,495,444 v |26; | | +----------------+ |27; | +----------------------- | b3 [12 bytes] | |28; | +----------------+ |29; | | |30; | | 1,532,990,888 |31; | v |32; | +----------------+ | 574,869,94633; | +-------------- | b4 [12 bytes] | |34; | | +----------------+ |35; | | | |36; | | | 574,871,583 |37; | | v |38; | | +----------------+ |39; | | | b5 [116 bytes] | -+ |40; | | +----------------+ | |41; | | | | |42; | | | 1,636 | |43; | | v | |44; | | +----------------+ | |45; | | +------ | b6 [32 bytes] | | |46; | | | +----------------+ | |47; | | | | | |48; | | | | 7 | 3,065,981,778 |49; | | | v | |50; | | | +----------------+ | |51; | | | 1,628 | b9 [16 bytes] | | |52; | | | +----------------+ | |53; | | | | | |54; | | | | 7 | |55; | | | v | |56; | | | +----------------+ | |57; | | +-----> | b7 [12 bytes] | | |58; | | +----------------+ | |59; | | | | |60; | | 958,119,305 | 1,636 | |61; | | v v v62; | | +------------------------------------------+63; | +-------------> | |64; | 1,532,990,889 | b1 [36 bytes] |65; +-------------------------------> | |66; +------------------------------------------+67;68; An expected output with a large chain-split-threshold -- the layout score is69; increased by ~17%70;71; CHECK-LABEL: Applying ext-tsp layout72; CHECK: original layout score: 23587612604815436.0073; CHECK: optimized layout score: 27891096739311172.0074; CHECK: b075; CHECK: b276; CHECK: b377; CHECK: b478; CHECK: b579; CHECK: b880; CHECK: b181; CHECK: b682; CHECK: b783; CHECK: b984;85; An expected output with chain-split-threshold=1 (disabling split point enumeration)86;87; CHECK2-LABEL: Applying ext-tsp layout88; CHECK2: original layout score: 23587612604815436.0089; CHECK2: optimized layout score: 27891096739311172.0090; CHECK2: b091; CHECK2: b292; CHECK2: b393; CHECK2: b494; CHECK2: b595; CHECK2: b896; CHECK2: b197; CHECK2: b698; CHECK2: b799; CHECK2: b9100;101; An expected output with ext-tsp disabled -- the layout is not modified:102;103; CHECK3-LABEL: func_large:104; CHECK3: b0105; CHECK3: b1106; CHECK3: b2107; CHECK3: b3108; CHECK3: b4109; CHECK3: b5110; CHECK3: b6111; CHECK3: b7112; CHECK3: b8113; CHECK3: b9114;115; An expected output with function size larger than the threshold -- the layout is not modified:116;117; CHECK4-LABEL: func_large:118; CHECK4: b0119; CHECK4: b1120; CHECK4: b2121; CHECK4: b3122; CHECK4: b4123; CHECK4: b5124; CHECK4: b6125; CHECK4: b7126; CHECK4: b8127; CHECK4: b9128 129b0:130 %0 = load i32, ptr @yydebug, align 4131 %cmp = icmp ne i32 %0, 0132 call void @a()133 call void @a()134 call void @a()135 call void @a()136 call void @a()137 call void @a()138 call void @a()139 call void @a()140 call void @a()141 call void @a()142 call void @a()143 call void @a()144 call void @a()145 call void @a()146 call void @a()147 call void @a()148 call void @a()149 call void @a()150 br i1 %cmp, label %b1, label %b2, !prof !1151b1:152 call void @b()153 call void @b()154 call void @b()155 call void @b()156 call void @b()157 call void @b()158 call void @b()159 call void @b()160 ret void161b2:162 call void @c()163 call void @c()164 call void @c()165 call void @c()166 call void @c()167 call void @c()168 call void @c()169 call void @c()170 call void @c()171 call void @c()172 br i1 %cmp, label %b3, label %b8, !prof !2173b3:174 call void @d()175 call void @d()176 br i1 %cmp, label %b4, label %b8, !prof !3177b4:178 call void @e()179 call void @e()180 br i1 %cmp, label %b5, label %b1, !prof !4181b5: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 call void @f()197 call void @f()198 call void @f()199 call void @f()200 call void @f()201 call void @f()202 call void @f()203 call void @f()204 call void @f()205 call void @f()206 call void @f()207 call void @f()208 call void @f()209 call void @f()210 br i1 %cmp, label %b1, label %b6, !prof !5211b6:212 call void @g()213 call void @g()214 call void @g()215 call void @g()216 call void @g()217 call void @g()218 call void @g()219 br i1 %cmp, label %b7, label %b9, !prof !6220b7:221 call void @h()222 call void @h()223 br label %b1224b8: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 call void @i()272 call void @i()273 call void @i()274 call void @i()275 call void @i()276 call void @i()277 call void @i()278 call void @i()279 call void @i()280 call void @i()281 call void @i()282 call void @i()283 call void @i()284 call void @i()285 br label %b1286b9:287 call void @j()288 call void @j()289 call void @j()290 br label %b7291}292 293 294declare void @a()295declare void @b()296declare void @c()297declare void @d()298declare void @e()299declare void @f()300declare void @g()301declare void @h()302declare void @i()303declare void @j()304 305!0 = !{!"function_entry_count", i64 6131963556}306!1 = !{!"branch_weights", i32 3065981778, i32 3065981778}307!2 = !{!"branch_weights", i32 2299486333, i32 766495444}308!3 = !{!"branch_weights", i32 1532990888, i32 766495444}309!4 = !{!"branch_weights", i32 574871583, i32 958119305}310!5 = !{!"branch_weights", i32 574869946, i32 1636}311!6 = !{!"branch_weights", i32 1628, i32 7}312