Compiler projects using 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: 10756755324.57
; 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}