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}
 |