| ; REQUIRES: asserts |
| ; 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 |
| ; 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 |
| ; 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 |
| |
| @yydebug = dso_local global i32 0, align 4 |
| |
| define void @func_large() !prof !0 { |
| ; A largee 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: 9171074274.27 |
| ; CHECK: optimized layout score: 10844307310.87 |
| ; 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 splitting) -- the |
| ; increase of the layout score is smaller, ~7%: |
| ; |
| ; CHECK2-LABEL: Applying ext-tsp layout |
| ; CHECK2: original layout score: 9171074274.27 |
| ; CHECK2: optimized layout score: 9810644873.57 |
| ; CHECK2: b0 |
| ; CHECK2: b2 |
| ; CHECK2: b3 |
| ; CHECK2: b4 |
| ; CHECK2: b5 |
| ; CHECK2: b1 |
| ; CHECK2: b8 |
| ; 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 |
| |
| 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} |