mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 18:46:06 +00:00

If an end section basic block ends in an unconditional branch to its fallthrough, BasicBlockSections will duplicate the unconditional branch. This doesn't break x86, but it is a (slight) size optimization and more importantly prevents AArch64 builds from breaking. Ex: ``` bb1 (bbsections Hot): jmp bb2 bb2 (bbsections Cold): /* do work... */ ``` After running sortBasicBlocksAndUpdateBranches(): ``` bb1 (bbsections Hot): jmp bb2 jmp bb2 bb2 (bbsections Cold): /* do work... */ ``` Differential Revision: https://reviews.llvm.org/D158674
530 lines
16 KiB
LLVM
530 lines
16 KiB
LLVM
; REQUIRES: aarch64-registered-target
|
|
; REQUIRES: x86-registered-target
|
|
|
|
; COM: Machine function splitting with FDO profiles
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-X86
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=0 -mfs-count-threshold=2000 | FileCheck %s --dump-input=always -check-prefixes=MFS-OPTS1,MFS-OPTS1-X86
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-X86
|
|
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-X86
|
|
; RUN: llc < %s -mtriple=x86_64 -split-machine-functions -O0 -mfs-psi-cutoff=0 -mfs-count-threshold=10000 | FileCheck %s -check-prefixes=MFS-O0,MFS-O0-X86
|
|
|
|
; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-allow-unsupported-triple | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-AARCH64
|
|
; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-allow-unsupported-triple -mfs-psi-cutoff=0 -mfs-count-threshold=2000 | FileCheck %s --dump-input=always -check-prefixes=MFS-OPTS1,MFS-OPTS1-AARCH64
|
|
; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-allow-unsupported-triple -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-AARCH64
|
|
; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-allow-unsupported-triple -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-AARCH64
|
|
; RUN: llc < %s -mtriple=aarch64 -enable-split-machine-functions -O0 -mfs-allow-unsupported-triple -mfs-psi-cutoff=0 -mfs-count-threshold=10000 | FileCheck %s --dump-input=always -check-prefixes=MFS-O0,MFS-O0-AARCH64
|
|
|
|
; COM: Machine function splitting with AFDO profiles
|
|
; RUN: sed 's/InstrProf/SampleProfile/g' %s > %t.ll
|
|
; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS
|
|
; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS2
|
|
|
|
define void @foo1(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 {
|
|
;; Check that cold block is moved to .text.split.
|
|
; MFS-DEFAULTS-LABEL: foo1
|
|
; MFS-DEFAULTS: .section .text.split.foo1
|
|
; MFS-DEFAULTS-NEXT: foo1.cold:
|
|
; MFS-DEFAULTS-X86-NOT: callq bar
|
|
; MFS-DEFAULTS-X86-NEXT: callq baz
|
|
; MFS-DEFAULTS-AARCH64-NOT: bl bar
|
|
; MFS-DEFAULTS-AARCH64-NEXT: bl baz
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = %1
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo2(i1 zeroext %0) nounwind !prof !23 !section_prefix !16 {
|
|
;; Check that function marked unlikely is not split.
|
|
; MFS-DEFAULTS-LABEL: foo2
|
|
; MFS-DEFAULTS-NOT: foo2.cold:
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = %1
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo3(i1 zeroext %0) nounwind !section_prefix !15 {
|
|
;; Check that function without profile data is not split.
|
|
; MFS-DEFAULTS-LABEL: foo3
|
|
; MFS-DEFAULTS-NOT: foo3.cold:
|
|
br i1 %0, label %2, label %4
|
|
|
|
2: ; preds = %1
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo4(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 {
|
|
;; Check that count threshold works.
|
|
; MFS-OPTS1-LABEL: foo4
|
|
; MFS-OPTS1: .section .text.split.foo4
|
|
; MFS-OPTS1-NEXT: foo4.cold:
|
|
; MFS-OPTS1-X86-NOT: callq bar
|
|
; MFS-OPTS1-X86-NOT: callq baz
|
|
; MFS-OPTS1-X86-NEXT: callq bam
|
|
; MFS-OPTS1-AARCH64-NOT: bl bar
|
|
; MFS-OPTS1-AARCH64-NOT: bl baz
|
|
; MFS-OPTS1-AARCH64-NEXT: bl bam
|
|
br i1 %0, label %3, label %7, !prof !18
|
|
|
|
3:
|
|
%4 = call i32 @bar()
|
|
br label %7
|
|
|
|
5:
|
|
%6 = call i32 @baz()
|
|
br label %7
|
|
|
|
7:
|
|
br i1 %1, label %8, label %10, !prof !19
|
|
|
|
8:
|
|
%9 = call i32 @bam()
|
|
br label %12
|
|
|
|
10:
|
|
%11 = call i32 @baz()
|
|
br label %12
|
|
|
|
12:
|
|
%13 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo5(i1 zeroext %0, i1 zeroext %1) nounwind !prof !20 {
|
|
;; Check that profile summary info cutoff works.
|
|
; MFS-OPTS2-LABEL: foo5
|
|
; MFS-OPTS2: .section .text.split.foo5
|
|
; MFS-OPTS2-NEXT: foo5.cold:
|
|
; MFS-OPTS2-X86-NOT: callq bar
|
|
; MFS-OPTS2-X86-NOT: callq baz
|
|
; MFS-OPTS2-X86-NEXT: callq bam
|
|
; MFS-OPTS2-AARCH64-NOT: bl bar
|
|
; MFS-OPTS2-AARCH64-NOT: bl baz
|
|
; MFS-OPTS2-AARCH64-NEXT: bl bam
|
|
br i1 %0, label %3, label %7, !prof !21
|
|
|
|
3:
|
|
%4 = call i32 @bar()
|
|
br label %7
|
|
|
|
5:
|
|
%6 = call i32 @baz()
|
|
br label %7
|
|
|
|
7:
|
|
br i1 %1, label %8, label %10, !prof !22
|
|
|
|
8:
|
|
%9 = call i32 @bam()
|
|
br label %12
|
|
|
|
10:
|
|
%11 = call i32 @baz()
|
|
br label %12
|
|
|
|
12:
|
|
%13 = call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo6(i1 zeroext %0) nounwind section "nosplit" !prof !14 {
|
|
;; Check that function with section attribute is not split.
|
|
; MFS-DEFAULTS-LABEL: foo6
|
|
; MFS-DEFAULTS-NOT: foo6.cold:
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = %1
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define i32 @foo7(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {
|
|
;; Check that a single cold ehpad is split out.
|
|
; MFS-DEFAULTS-LABEL: foo7
|
|
; MFS-DEFAULTS: .section .text.split.foo7,"ax",@progbits
|
|
; MFS-DEFAULTS-NEXT: foo7.cold:
|
|
; MFS-DEFAULTS-X86: callq baz
|
|
; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT
|
|
; MFS-DEFAULTS-AARCH64: bl baz
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %try.cont unwind label %lpad
|
|
|
|
lpad:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
resume { ptr, i32 } %1
|
|
|
|
try.cont:
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = try.cont
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret i32 %7
|
|
}
|
|
|
|
define i32 @foo8(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {
|
|
;; Check that all ehpads are treated as hot if one of them is hot.
|
|
; MFS-DEFAULTS-LABEL: foo8
|
|
; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT
|
|
; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT
|
|
; MFS-DEFAULTS: .section .text.split.foo8,"ax",@progbits
|
|
; MFS-DEFAULTS-NEXT: foo8.cold:
|
|
; MFS-DEFAULTS-X86: callq baz
|
|
; MFS-DEFAULTS-AARCH64: bl baz
|
|
|
|
;; Check that all ehpads are by default treated as cold with -mfs-split-ehcode.
|
|
; MFS-EH-SPLIT-LABEL: foo8
|
|
; MFS-EH-SPLIT-X86: callq baz
|
|
; MFS-EH-SPLIT-AARCH64: bl baz
|
|
; MFS-EH-SPLIT-X86: .section .text.split.foo8,"ax",@progbits
|
|
; MFS-EH-SPLIT-X86-NEXT: foo8.cold:
|
|
; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT
|
|
; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %try.cont unwind label %lpad1
|
|
|
|
lpad1:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
resume { ptr, i32 } %1
|
|
|
|
try.cont:
|
|
br i1 %0, label %hot, label %cold, !prof !17
|
|
|
|
hot:
|
|
%2 = call i32 @bar()
|
|
invoke void @_Z1fv()
|
|
to label %exit unwind label %lpad2, !prof !21
|
|
|
|
lpad2:
|
|
%3 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
resume { ptr, i32 } %3
|
|
|
|
cold:
|
|
%4 = call i32 @baz()
|
|
br label %exit
|
|
|
|
exit:
|
|
%5 = tail call i32 @qux()
|
|
ret i32 %5
|
|
}
|
|
|
|
define void @foo9(i1 zeroext %0) nounwind #0 !prof !14 {
|
|
;; Check that function with section attribute is not split.
|
|
; MFS-DEFAULTS-LABEL: foo9
|
|
; MFS-DEFAULTS-NOT: foo9.cold:
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = %1
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = %1
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define i32 @foo10(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {
|
|
;; Check that nop is inserted just before the EH pad if it's beginning a section.
|
|
; MFS-DEFAULTS-LABEL: foo10
|
|
; MFS-DEFAULTS-X86-LABEL: callq baz
|
|
; MFS-DEFAULTS-AARCH64: bl baz
|
|
; MFS-DEFAULTS-X86: .section .text.split.foo10,"ax",@progbits
|
|
; MFS-DEFAULTS-X86-NEXT: foo10.cold:
|
|
; MFS-DEFAULTS-X86: nop
|
|
; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %try.cont unwind label %lpad, !prof !17
|
|
|
|
lpad:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
resume { ptr, i32 } %1
|
|
|
|
try.cont:
|
|
%2 = call i32 @baz()
|
|
ret i32 %2
|
|
}
|
|
|
|
define void @foo11(i1 zeroext %0) personality ptr @__gxx_personality_v0 {
|
|
;; Check that function having landing pads are split with mfs-split-ehcode
|
|
;; even in the absence of profile data
|
|
; MFS-EH-SPLIT-LABEL: foo11
|
|
; MFS-EH-SPLIT-X86: .section .text.split.foo11,"ax",@progbits
|
|
; MFS-EH-SPLIT-X86-NEXT: foo11.cold:
|
|
; MFS-EH-SPLIT-X86: nop
|
|
; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %2 unwind label %lpad
|
|
|
|
lpad:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
resume { ptr, i32 } %1
|
|
|
|
2: ; preds = entry
|
|
%3 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define i32 @foo12(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14 {
|
|
;; Check that all code reachable from ehpad is split out with cycles.
|
|
; MFS-EH-SPLIT-LABEL: foo12
|
|
; MFS-EH-SPLIT: .section .text.split.foo12,"ax",@progbits
|
|
; MFS-EH-SPLIT-NEXT: foo12.cold:
|
|
; MFS-EH-SPLIT-X86: callq bar
|
|
; MFS-EH-SPLIT-X86: callq baz
|
|
; MFS-EH-SPLIT-X86: callq qux
|
|
; MFS-EH-SPLIT-AARCH64: bl bar
|
|
; MFS-EH-SPLIT-AARCH64: bl baz
|
|
; MFS-EH-SPLIT-AARCH64: bl qux
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %8 unwind label %lpad
|
|
|
|
lpad:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
br label %2
|
|
|
|
2: ; preds = lpad
|
|
%3 = call i32 @bar()
|
|
br i1 %0, label %4, label %6
|
|
|
|
4: ; preds = lpad
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
br i1 %0, label %2, label %8
|
|
|
|
8: ; preds = %6
|
|
ret i32 0
|
|
}
|
|
|
|
define i32 @foo13(i1 zeroext %0) personality ptr @__gxx_personality_v0 !prof !14{
|
|
;; Check that all code reachable from EH
|
|
;; that is also reachable from outside EH pad
|
|
;; is not touched.
|
|
; MFS-EH-SPLIT-LABEL: foo13
|
|
; MFS-EH-SPLIT-X86: callq bam
|
|
; MFS-EH-SPLIT-AARCH64: bl bam
|
|
; MFS-EH-SPLIT: .section .text.split.foo13,"ax",@progbits
|
|
; MFS-EH-SPLIT-NEXT: foo13.cold:
|
|
; MFS-EH-SPLIT-X86: callq baz
|
|
; MFS-EH-SPLIT-X86: callq bar
|
|
; MFS-EH-SPLIT-X86: callq qux
|
|
; MFS-EH-SPLIT-AARCH64: bl baz
|
|
; MFS-EH-SPLIT-AARCH64: bl bar
|
|
; MFS-EH-SPLIT-AARCH64: bl qux
|
|
entry:
|
|
invoke void @_Z1fv()
|
|
to label %try.cont unwind label %lpad, !prof !17
|
|
|
|
lpad:
|
|
%1 = landingpad { ptr, i32 }
|
|
cleanup
|
|
catch ptr @_ZTIi
|
|
br i1 %0, label %2, label %4, !prof !17
|
|
|
|
2: ; preds = lpad
|
|
%3 = call i32 @bar()
|
|
br label %6
|
|
|
|
4: ; preds = lpad
|
|
%5 = call i32 @baz()
|
|
br label %6
|
|
|
|
6: ; preds = %4, %2
|
|
%7 = tail call i32 @qux()
|
|
br i1 %0, label %2, label %try.cont, !prof !17
|
|
|
|
try.cont: ; preds = %entry
|
|
%8 = call i32 @bam()
|
|
ret i32 %8
|
|
}
|
|
|
|
define void @foo14(i1 zeroext %0, i1 zeroext %1) nounwind !prof !24 {
|
|
; FSAFDO-MFS: .section .text.split.foo14,"ax"
|
|
; FSAFDO-MFS: foo14.cold:
|
|
br i1 %0, label %3, label %7, !prof !25
|
|
|
|
3:
|
|
%4 = call i32 @bar()
|
|
br label %7
|
|
|
|
5:
|
|
%6 = call i32 @baz()
|
|
br label %7
|
|
|
|
7:
|
|
br i1 %1, label %8, label %10, !prof !26
|
|
|
|
8:
|
|
%9 = call i32 @bam()
|
|
br label %12
|
|
|
|
10:
|
|
%11 = call i32 @baz()
|
|
br label %12
|
|
|
|
12:
|
|
%13 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo15(i1 zeroext %0, i1 zeroext %1) nounwind !prof !27 {
|
|
;; HasAccurateProfile is false, foo15 is hot, but no profile data for
|
|
;; blocks, no split should happen.
|
|
; FSAFDO-MFS2-NOT: .section .text.split.foo15,"ax"
|
|
; FSAFDO-MFS2-NOT: foo15.cold:
|
|
br i1 %0, label %3, label %7
|
|
|
|
3:
|
|
%4 = call i32 @bar()
|
|
br label %7
|
|
|
|
5:
|
|
%6 = call i32 @baz()
|
|
br label %7
|
|
|
|
7:
|
|
br i1 %1, label %8, label %10
|
|
|
|
8:
|
|
%9 = call i32 @bam()
|
|
br label %12
|
|
|
|
10:
|
|
%11 = call i32 @baz()
|
|
br label %12
|
|
|
|
12:
|
|
%13 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
define void @foo16(i1 zeroext %0) nounwind !prof !14 !section_prefix !15 {
|
|
;; Check that an unconditional branch is only appended to a block
|
|
;; if it would fall through to the wrong block otherwise.
|
|
; MFS-O0-LABEL: foo16
|
|
; MFS-O0-X86: jmp
|
|
; MFS-O0-X86-NOT: jmp
|
|
; MFS-O0-AARCH64: br
|
|
; MFS-O0-AARCH64: br
|
|
; MFS-O0-AARCH64-NOT: br
|
|
; MFS-O0: .section .text.split.foo16
|
|
; MFS-O0-NEXT: foo16.cold
|
|
%2 = call i32 @baz()
|
|
br i1 false, label %3, label %5, !prof !25
|
|
|
|
3: ; preds = %1
|
|
%4 = call i32 @bar()
|
|
unreachable
|
|
|
|
5: ; preds = %1
|
|
%6 = tail call i32 @qux()
|
|
ret void
|
|
}
|
|
|
|
declare i32 @bar()
|
|
declare i32 @baz()
|
|
declare i32 @bam()
|
|
declare i32 @qux()
|
|
declare void @_Z1fv()
|
|
declare i32 @__gxx_personality_v0(...)
|
|
|
|
@_ZTIi = external constant ptr
|
|
|
|
attributes #0 = { "implicit-section-name"="nosplit" }
|
|
|
|
!llvm.module.flags = !{!0}
|
|
!0 = !{i32 1, !"ProfileSummary", !1}
|
|
!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
|
|
!2 = !{!"ProfileFormat", !"InstrProf"}
|
|
!3 = !{!"TotalCount", i64 10000}
|
|
!4 = !{!"MaxCount", i64 10}
|
|
!5 = !{!"MaxInternalCount", i64 1}
|
|
!6 = !{!"MaxFunctionCount", i64 1000}
|
|
!7 = !{!"NumCounts", i64 3}
|
|
!8 = !{!"NumFunctions", i64 5}
|
|
!9 = !{!"DetailedSummary", !10}
|
|
!10 = !{!11, !12, !13}
|
|
!11 = !{i32 10000, i64 100, i32 1}
|
|
!12 = !{i32 999900, i64 100, i32 1}
|
|
!13 = !{i32 999999, i64 1, i32 2}
|
|
!14 = !{!"function_entry_count", i64 7000}
|
|
!15 = !{!"function_section_prefix", !"hot"}
|
|
!16 = !{!"function_section_prefix", !"unlikely"}
|
|
!17 = !{!"branch_weights", i32 7000, i32 0}
|
|
!18 = !{!"branch_weights", i32 3000, i32 4000}
|
|
!19 = !{!"branch_weights", i32 1000, i32 6000}
|
|
!20 = !{!"function_entry_count", i64 10000}
|
|
!21 = !{!"branch_weights", i32 6000, i32 4000}
|
|
!22 = !{!"branch_weights", i32 80, i32 9920}
|
|
!23 = !{!"function_entry_count", i64 7}
|
|
!24 = !{!"function_entry_count", i64 10000}
|
|
!25 = !{!"branch_weights", i32 0, i32 7000}
|
|
!26 = !{!"branch_weights", i32 1000, i32 6000}
|
|
!27 = !{!"function_entry_count", i64 10000}
|