[BOLT][YAML] Only read first profile per function

D159460 regressed the bugfix in D156644. Fix that and emit a warning.
Add a test case.

Reviewed By: #bolt, maksfb

Differential Revision: https://reviews.llvm.org/D159529
This commit is contained in:
Amir Ayupov 2023-09-18 20:39:30 -07:00
parent 4ea883cbbb
commit 6a1cf545cc
2 changed files with 65 additions and 2 deletions

View File

@ -294,9 +294,19 @@ Error YAMLProfileReader::preprocessProfile(BinaryContext &BC) {
buildNameMaps(BC);
// Preliminary assign function execution count.
for (auto [YamlBF, BF] : llvm::zip_equal(YamlBP.Functions, ProfileBFs))
if (BF)
for (auto [YamlBF, BF] : llvm::zip_equal(YamlBP.Functions, ProfileBFs)) {
if (!BF)
continue;
if (!BF->hasProfile()) {
BF->setExecutionCount(YamlBF.ExecCount);
} else {
if (opts::Verbosity >= 1) {
errs() << "BOLT-WARNING: dropping duplicate profile for " << YamlBF.Name
<< '\n';
}
BF = nullptr;
}
}
return Error::success();
}

View File

@ -0,0 +1,53 @@
# This test ensures that a YAML profile with multiple profiles matching the same
# function is handled gracefully.
# REQUIRES: system-linux
# RUN: split-file %s %t
# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %t/main.s -o %t.o
# RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib
# RUN: llvm-bolt %t.exe -o /dev/null --data %t/profile.yaml \
# RUN: --profile-ignore-hash -v=1 2>&1 | FileCheck %s
# CHECK: BOLT-WARNING: dropping duplicate profile for main_alias(*2)
#--- main.s
.globl main_alias
.type main_alias, %function
main_alias:
.globl main
.type main, %function
main:
.cfi_startproc
cmpl $0x0, %eax
retq
.cfi_endproc
.size main, .-main
.size main_alias, .-main_alias
#--- profile.yaml
---
header:
profile-version: 1
binary-name: 'yaml-multiple-profiles.test.tmp.exe'
binary-build-id: '<unknown>'
profile-flags: [ lbr ]
profile-origin: branch profile reader
profile-events: ''
dfs-order: false
functions:
- name: 'main(*2)'
fid: 1
hash: 0x50BBA3441D436491
exec: 1
nblocks: 1
blocks:
- bid: 0
insns: 2
hash: 0x4D4D8FAF7D4C0000
- name: 'main_alias(*2)'
fid: 1
hash: 0x50BBA3441D436491
exec: 1
nblocks: 1
blocks:
- bid: 0
insns: 2
hash: 0x4D4D8FAF7D4C0000
...