| ; REQUIRES: asserts | |
| ; 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 %s | |
| ; 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=CHECK2 | |
| ; RUN: llc -mcpu=corei7 -mtriple=x86_64-linux -verify-machineinstrs -debug-only=block-placement < %s 2>&1 | FileCheck %s -check-prefix=CHECK3 | |
| ; 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=CHECK4 | |
| @yydebug = dso_local global i32 0, align 4 | |
| define void @func_large() !prof !0 { | |
| ; A large CFG instance where chain splitting helps to | |
| ; compute a better basic block ordering. The test verifies that with chain | |
| ; splitting, the resulting layout is improved (e.g., the score is increased). | |
| ; | |
| ; +----------------+ | |
| ; | b0 [76 bytes] | -------------------+ | |
| ; +----------------+ | | |
| ; | | | |
| ; | 3,065,981,778 | | |
| ; v | | |
| ; +----------------+ 766,495,444 +----------------+ | | |
| ; | b8 [244 bytes] | <--------------- | b2 [4 bytes] | | | |
| ; +----------------+ +----------------+ | | |
| ; | ^ | | | |
| ; | | | 2,299,486,333 | | |
| ; | | 766,495,444 v | | |
| ; | | +----------------+ | | |
| ; | +----------------------- | b3 [12 bytes] | | | |
| ; | +----------------+ | | |
| ; | | | | |
| ; | | 1,532,990,888 | | |
| ; | v | | |
| ; | +----------------+ | 574,869,946 | |
| ; | +-------------- | b4 [12 bytes] | | | |
| ; | | +----------------+ | | |
| ; | | | | | |
| ; | | | 574,871,583 | | |
| ; | | v | | |
| ; | | +----------------+ | | |
| ; | | | b5 [116 bytes] | -+ | | |
| ; | | +----------------+ | | | |
| ; | | | | | | |
| ; | | | 1,636 | | | |
| ; | | v | | | |
| ; | | +----------------+ | | | |
| ; | | +------ | b6 [32 bytes] | | | | |
| ; | | | +----------------+ | | | |
| ; | | | | | | | |
| ; | | | | 7 | 3,065,981,778 | | |
| ; | | | v | | | |
| ; | | | +----------------+ | | | |
| ; | | | 1,628 | b9 [16 bytes] | | | | |
| ; | | | +----------------+ | | | |
| ; | | | | | | | |
| ; | | | | 7 | | | |
| ; | | | v | | | |
| ; | | | +----------------+ | | | |
| ; | | +-----> | b7 [12 bytes] | | | | |
| ; | | +----------------+ | | | |
| ; | | | | | | |
| ; | | 958,119,305 | 1,636 | | | |
| ; | | v v v | |
| ; | | +------------------------------------------+ | |
| ; | +-------------> | | | |
| ; | 1,532,990,889 | b1 [36 bytes] | | |
| ; +-------------------------------> | | | |
| ; +------------------------------------------+ | |
| ; | |
| ; An expected output with a large chain-split-threshold -- the layout score is | |
| ; increased by ~17% | |
| ; | |
| ; CHECK-LABEL: Applying ext-tsp layout | |
| ; CHECK: original layout score: 23587612604815436.00 | |
| ; CHECK: optimized layout score: 27891096739311172.00 | |
| ; CHECK: b0 | |
| ; CHECK: b2 | |
| ; CHECK: b3 | |
| ; CHECK: b4 | |
| ; CHECK: b5 | |
| ; CHECK: b8 | |
| ; CHECK: b1 | |
| ; CHECK: b6 | |
| ; CHECK: b7 | |
| ; CHECK: b9 | |
| ; | |
| ; An expected output with chain-split-threshold=1 (disabling split point enumeration) | |
| ; | |
| ; CHECK2-LABEL: Applying ext-tsp layout | |
| ; CHECK2: original layout score: 23587612604815436.00 | |
| ; CHECK2: optimized layout score: 27891096739311172.00 | |
| ; CHECK2: b0 | |
| ; CHECK2: b2 | |
| ; CHECK2: b3 | |
| ; CHECK2: b4 | |
| ; CHECK2: b5 | |
| ; CHECK2: b8 | |
| ; CHECK2: b1 | |
| ; CHECK2: b6 | |
| ; CHECK2: b7 | |
| ; CHECK2: b9 | |
| ; | |
| ; An expected output with ext-tsp disabled -- the layout is not modified: | |
| ; | |
| ; CHECK3-LABEL: func_large: | |
| ; CHECK3: b0 | |
| ; CHECK3: b1 | |
| ; CHECK3: b2 | |
| ; CHECK3: b3 | |
| ; CHECK3: b4 | |
| ; CHECK3: b5 | |
| ; CHECK3: b6 | |
| ; CHECK3: b7 | |
| ; CHECK3: b8 | |
| ; CHECK3: b9 | |
| ; | |
| ; An expected output with function size larger than the threshold -- the layout is not modified: | |
| ; | |
| ; CHECK4-LABEL: func_large: | |
| ; CHECK4: b0 | |
| ; CHECK4: b1 | |
| ; CHECK4: b2 | |
| ; CHECK4: b3 | |
| ; CHECK4: b4 | |
| ; CHECK4: b5 | |
| ; CHECK4: b6 | |
| ; CHECK4: b7 | |
| ; CHECK4: b8 | |
| ; CHECK4: b9 | |
| b0: | |
| %0 = load i32, ptr @yydebug, align 4 | |
| %cmp = icmp ne i32 %0, 0 | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| call void @a() | |
| br i1 %cmp, label %b1, label %b2, !prof !1 | |
| b1: | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| call void @b() | |
| ret void | |
| b2: | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| call void @c() | |
| br i1 %cmp, label %b3, label %b8, !prof !2 | |
| b3: | |
| call void @d() | |
| call void @d() | |
| br i1 %cmp, label %b4, label %b8, !prof !3 | |
| b4: | |
| call void @e() | |
| call void @e() | |
| br i1 %cmp, label %b5, label %b1, !prof !4 | |
| b5: | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| call void @f() | |
| br i1 %cmp, label %b1, label %b6, !prof !5 | |
| b6: | |
| call void @g() | |
| call void @g() | |
| call void @g() | |
| call void @g() | |
| call void @g() | |
| call void @g() | |
| call void @g() | |
| br i1 %cmp, label %b7, label %b9, !prof !6 | |
| b7: | |
| call void @h() | |
| call void @h() | |
| br label %b1 | |
| b8: | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| call void @i() | |
| br label %b1 | |
| b9: | |
| call void @j() | |
| call void @j() | |
| call void @j() | |
| br label %b7 | |
| } | |
| declare void @a() | |
| declare void @b() | |
| declare void @c() | |
| declare void @d() | |
| declare void @e() | |
| declare void @f() | |
| declare void @g() | |
| declare void @h() | |
| declare void @i() | |
| declare void @j() | |
| !0 = !{!"function_entry_count", i64 6131963556} | |
| !1 = !{!"branch_weights", i32 3065981778, i32 3065981778} | |
| !2 = !{!"branch_weights", i32 2299486333, i32 766495444} | |
| !3 = !{!"branch_weights", i32 1532990888, i32 766495444} | |
| !4 = !{!"branch_weights", i32 574871583, i32 958119305} | |
| !5 = !{!"branch_weights", i32 574869946, i32 1636} | |
| !6 = !{!"branch_weights", i32 1628, i32 7} |