This PR implements the emitting of the post-link CFG information in PGO analysis map, as explained in the [RFC](https://discourse.llvm.org/t/rfc-extending-the-pgo-analysis-map-with-propeller-cfg-frequencies/88617). This is enabled by a flag `pgo-analysis-map-emit-bb-sections-cfg`. This PR bumps the SHT_LLVM_BB_ADDR_MAP version to 5. Also includes some refactoring changes related to storing the CFG in the Basic block sections profile reader.
80 lines
2.7 KiB
LLVM
80 lines
2.7 KiB
LLVM
;; Check that the -basic-block-address-map option works when used along with -basic-block-sections.
|
|
;; Let a function with 4 basic blocks get split into 2 sections.
|
|
; RUN: echo '!_Z3bazb' > %t
|
|
; RUN: echo '!!0 2' >> %t
|
|
; RUN: llc < %s -mtriple=x86_64 -basic-block-address-map -basic-block-sections=%t | FileCheck %s
|
|
|
|
define void @_Z3bazb(i1 zeroext) personality ptr @__gxx_personality_v0 {
|
|
br i1 %0, label %2, label %7
|
|
|
|
2:
|
|
%3 = invoke i32 @_Z3barv()
|
|
to label %7 unwind label %5
|
|
br label %9
|
|
|
|
5:
|
|
landingpad { ptr, i32 }
|
|
catch ptr null
|
|
br label %9
|
|
|
|
7:
|
|
%8 = call i32 @_Z3foov()
|
|
br label %9
|
|
|
|
9:
|
|
ret void
|
|
}
|
|
|
|
declare i32 @_Z3barv() #1
|
|
|
|
declare i32 @_Z3foov() #1
|
|
|
|
declare i32 @__gxx_personality_v0(...)
|
|
|
|
; CHECK: .text
|
|
; CHECK-LABEL: _Z3bazb:
|
|
; CHECK-LABEL: .Lfunc_begin0:
|
|
; CHECK-LABEL: .LBB_END0_0:
|
|
; CHECK-LABEL: .LBB0_1:
|
|
; CHECK-LABEL: .LBB_END0_1:
|
|
; CHECK: .section .text.split._Z3bazb,"ax",@progbits
|
|
; CHECK-LABEL: _Z3bazb.cold:
|
|
; CHECK-LABEL: .LBB0_2_CS0:
|
|
; CHECK-LABEL: .LBB_END0_2:
|
|
; CHECK-LABEL: .LBB0_3:
|
|
; CHECK-LABEL: .LBB0_3_CS0:
|
|
; CHECK-LABEL: .LBB_END0_3:
|
|
; CHECK-LABEL: .Lfunc_end0:
|
|
|
|
; CHECK: .section .llvm_bb_addr_map,"o",@llvm_bb_addr_map,.text.hot._Z3bazb
|
|
; CHECK-NEXT: .byte 5 # version
|
|
; CHECK-NEXT: .short 40 # feature
|
|
; CHECK-NEXT: .byte 2 # number of basic block ranges
|
|
; CHECK-NEXT: .quad .Lfunc_begin0 # base address
|
|
; CHECK-NEXT: .byte 2 # number of basic blocks
|
|
; CHECK-NEXT: .byte 0 # BB id
|
|
; CHECK-NEXT: .uleb128 .Lfunc_begin0-.Lfunc_begin0
|
|
; CHECK-NEXT: .byte 0 # number of callsites
|
|
; CHECK-NEXT: .uleb128 .LBB_END0_0-.Lfunc_begin0
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .byte 2 # BB id
|
|
; CHECK-NEXT: .uleb128 .LBB0_1-.LBB_END0_0
|
|
; CHECK-NEXT: .byte 0 # number of callsites
|
|
; CHECK-NEXT: .uleb128 .LBB_END0_1-.LBB0_1
|
|
; CHECK-NEXT: .byte 5
|
|
; CHECK-NEXT: .quad _Z3bazb.cold # base address
|
|
; CHECK-NEXT: .byte 2 # number of basic blocks
|
|
; CHECK-NEXT: .byte 1 # BB id
|
|
; CHECK-NEXT: .uleb128 _Z3bazb.cold-_Z3bazb.cold
|
|
; CHECK-NEXT: .byte 1 # number of callsites
|
|
; CHECK-NEXT: .uleb128 .LBB0_2_CS0-_Z3bazb.cold
|
|
; CHECK-NEXT: .uleb128 .LBB_END0_2-.LBB0_2_CS0
|
|
; CHECK-NEXT: .byte 8
|
|
; CHECK-NEXT: .byte 3 # BB id
|
|
; CHECK-NEXT: .uleb128 .LBB0_3-.LBB_END0_2
|
|
; CHECK-NEXT: .byte 1 # number of callsites
|
|
; CHECK-NEXT: .uleb128 .LBB0_3_CS0-.LBB0_3
|
|
; CHECK-NEXT: .uleb128 .LBB_END0_3-.LBB0_3_CS0
|
|
; CHECK-NEXT: .byte 1
|
|
|