298 lines
9.1 KiB
LLVM
298 lines
9.1 KiB
LLVM
; 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}
|