Hongtao Yu 1662cfa4be [CSSPGO][CSProfileConverter] Remove call target samples when including callee samples into caller.
When a flat CS profile is converted to a nested profile, the call target samples for inlined callee contexts are left over in the callsite target map. This could cause indirect call promotion to function improperly. One issue is that the inlined callsites are treated with double amount of samples. The other is the inlined callsites are reconsidered for subsequent PGO ICP.

I'm fixing this by excluding call targets from the callsite for inlined targets. While fixing this I found that callsite target sum and the number of body samples for that callsite could be mismatched. {D122609} has an explanation and a fix for that on llvm-profgen side. For now I'm tolerating it in this change.

Reviewed By: wenlei

Differential Revision: https://reviews.llvm.org/D125266
2022-05-13 09:19:32 -07:00

84 lines
4.8 KiB
Plaintext

; Test default llvm-profgen with preinline off
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=0 --gen-cs-nested-profile=0 --output=%t1
; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-DEFAULT
; Test llvm-profgen with preinliner on will merge not inlinable profile into base profile.
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t2
; RUN: FileCheck %s --input-file %t2 --check-prefix=CHECK-PREINL
; Test preinliner threshold that prevents all possible inlining and merges everything into base profile.
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=0 --output=%t3
; RUN: FileCheck %s --input-file %t3 --check-prefix=CHECK-NO-PREINL
; Test cold profile trimming. Only base profiles should be dropped.
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t4 --trim-cold-profile=1 --profile-summary-hot-count=400
; RUN: FileCheck %s --input-file %t4 --check-prefix=CHECK-TRIM
; Test llvm-profgen with preinliner on will merge not inlinable profile into base profile.
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t5 --gen-cs-nested-profile=1
; RUN: FileCheck %s --input-file %t5 --check-prefix=CHECK-PREINL-NEST
; Test preInlined flat is set for extbinary profiles with preinliner on.
; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t2.prof
; RUN: llvm-profdata show --sample -show-sec-info-only %t2.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t5.prof --gen-cs-nested-profile=1
; RUN: llvm-profdata show --sample -show-sec-info-only %t5.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
; Test preInlined flat is set when converted from a text profile that has "ShouldInline" contexts.
; RUN: llvm-profdata merge --sample %t2 -o %t2.prof --extbinary
; RUN: llvm-profdata show --sample -show-sec-info-only %t2.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
; RUN: llvm-profdata merge --sample %t5 -o %t5.prof --extbinary
; RUN: llvm-profdata show --sample -show-sec-info-only %t5.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
; CHECK-DEFAULT: [main:1 @ foo]:309:0
; CHECK-DEFAULT-NEXT: 2.1: 14
; CHECK-DEFAULT-NEXT: 3: 15
; CHECK-DEFAULT-NEXT: 3.1: 14 bar:14
; CHECK-DEFAULT-NEXT: 3.2: 1
; CHECK-DEFAULT-NEXT: 65526: 14
; CHECK-DEFAULT-NEXT: !Attributes: 1
; CHECK-DEFAULT-NEXT:[main:1 @ foo:3.1 @ bar]:84:0
; CHECK-DEFAULT-NEXT: 1: 14
; CHECK-DEFAULT-NEXT: !Attributes: 1
; CHECK-PREINL: [foo]:309:0
; CHECK-PREINL-NEXT: 2.1: 14
; CHECK-PREINL-NEXT: 3: 15
; CHECK-PREINL-NEXT: 3.1: 14 bar:14
; CHECK-PREINL-NEXT: 3.2: 1
; CHECK-PREINL-NEXT: 65526: 14
; CHECK-PREINL-NEXT: !Attributes: 1
; CHECK-PREINL-NEXT:[foo:3.1 @ bar]:84:0
; CHECK-PREINL-NEXT: 1: 14
; CHECK-PREINL-NEXT: !Attributes: 3
; CHECK-NO-PREINL: [foo]:309:0
; CHECK-NO-PREINL-NEXT: 2.1: 14
; CHECK-NO-PREINL-NEXT: 3: 15
; CHECK-NO-PREINL-NEXT: 3.1: 14 bar:14
; CHECK-NO-PREINL-NEXT: 3.2: 1
; CHECK-NO-PREINL-NEXT: 65526: 14
; CHECK-NO-PREINL-NEXT: !Attributes: 1
; CHECK-NO-PREINL-NEXT:[bar]:84:0
; CHECK-NO-PREINL-NEXT: 1: 14
; CHECK-NO-PREINL-NEXT: !Attributes: 1
; CHECK-TRIM-NOT: [foo]:309:0
; CHECK-TRIM:[foo:3.1 @ bar]:84:0
; CHECK-TRIM-NEXT: 1: 14
; CHECK-TRIM-NEXT: !Attributes: 3
; CHECK-PREINL-NEST: foo:379:0
; CHECK-PREINL-NEST-NEXT: 2.1: 14
; CHECK-PREINL-NEST-NEXT: 3: 15
; CHECK-PREINL-NEST-NEXT: 3.2: 1
; CHECK-PREINL-NEST-NEXT: 65526: 14
; CHECK-PREINL-NEST-NEXT: 3.1: bar:84
; CHECK-PREINL-NEST-NEXT: 1: 14
; CHECK-PREINL-NEST-NEXT: !Attributes: 3
; CHECK-PREINL-FLAG: ProfileSummarySection {{.*}} Flags: {{{.*}}preInlined}