
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.
46 lines
1.6 KiB
LLVM
46 lines
1.6 KiB
LLVM
;; Tests for invalid path cloning with -basic-block-sections involving indirect branches.
|
|
|
|
declare void @effect(i32 zeroext)
|
|
|
|
;; Test failed application of path cloning for paths with indirect branches.
|
|
; RUN: echo 'v1' > %t1
|
|
; RUN: echo 'f bar' >> %t1
|
|
; RUN: echo 'p 0 1 2' >> %t1
|
|
; RUN: echo 'c 0 1.1 2.1 1' >> %t1
|
|
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t1 2> %t1.err | FileCheck %s
|
|
; RUN: FileCheck %s --check-prefix=WARN < %t1.err
|
|
; RUN: echo 'v1' > %t2
|
|
; RUN: echo 'f bar' >> %t2
|
|
; RUN: echo 'p 1 2' >> %t2
|
|
; RUN: echo 'c 0 1 2.1' >> %t2
|
|
; RUN: llc < %s -mtriple=x86_64-pc-linux -O0 -function-sections -basic-block-sections=%t2 2> %t2.err | FileCheck %s
|
|
; RUN: FileCheck %s --check-prefix=WARN < %t2.err
|
|
|
|
|
|
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: # %bb.1: # %b1
|
|
; CHECK: .section .text.split.bar,"ax",@progbits
|
|
; CHECK: bar.cold: # %b2
|
|
|
|
; WARN: warning: block #1 has indirect branch and appears as the non-tail block of a path in function bar
|