28b9126879
introduced the path cloning format in the basic-block-sections profile.
This PR validates and applies path clonings.
A path cloning is valid if all of these conditions hold:
1. All bb ids in the path are mapped to existing blocks.
2. Each two consecutive bb ids in the path have a successor relationship
in the CFG.
3. The path does not include a block with indirect branches, except
possibly as the last block.
Applying a path cloning involves cloning all blocks in the path (except
the first one) and setting up their branches.
Once all clonings are applied, the cluster information is used to guide
block layout in the modified function.
44 lines
1.4 KiB
LLVM
44 lines
1.4 KiB
LLVM
;; Test for cloning a path ending with indirect branch with -basic-block-sections.
|
|
|
|
declare void @effect(i32 zeroext)
|
|
|
|
;; Test valid application of cloning for a path with indirect branch.
|
|
; RUN: echo 'v1' > %t
|
|
; RUN: echo 'f bar' >> %t
|
|
; RUN: echo 'p 0 1' >> %t
|
|
; RUN: echo 'c 0 1.1 2 1' >> %t
|
|
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t | FileCheck %s
|
|
|
|
define void @bar(i1 %a, i1 %b) {
|
|
b0:
|
|
call void @effect(i32 0)
|
|
br i1 %a, label %b1, label %b2
|
|
b1: ; preds = %b0
|
|
call void @effect(i32 1)
|
|
%0 = select i1 %b, ; <ptr> [#uses=1]
|
|
ptr blockaddress(@bar, %b2),
|
|
ptr blockaddress(@bar, %b3)
|
|
indirectbr ptr %0, [label %b2, label %b3]
|
|
b2: ; preds = %b0, %b1
|
|
call void @effect(i32 2)
|
|
ret void
|
|
b3:
|
|
call void @effect(i32 3) ; preds = %b1
|
|
ret void
|
|
}
|
|
|
|
; CHECK: .section .text.bar,"ax",@progbits
|
|
; CHECK: bar:
|
|
; CHECK: # %bb.0: # %b0
|
|
; CHECK: je .LBB0_2
|
|
; CHECK-NEXT: # %bb.4: # %b1
|
|
; CHECK: jmpq *%rax
|
|
; CHECK-NEXT: .Ltmp0: # Block address taken
|
|
; CHECK-NEXT: .LBB0_2: # %b2
|
|
; CHECK: retq
|
|
; CHECK-NEXT: # %bb.1: # %b1
|
|
; CHECK: jmpq *%rax
|
|
; CHECK: .section .text.split.bar,"ax",@progbits
|
|
; CHECK: bar.cold: # %b3
|
|
|