mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
Emit metadata when instr. profiles hash mismatch occurs.
This patch emits "instr_prof_hash_mismatch" function annotation metadata if there is a hash mismatch while applying instrumented profiles. During the PGO optimized build using instrumented profiles, if the CFG of the function has changed since generating the profile, a hash mismatch is encountered. This patch emits this information as annotation metadata. We plan to use this with Propeller which is done at the machine IR level. Propeller is usually applied on top of PGO and a hash mismatch during PGO could be used to detect source drift. Differential Revision: https://reviews.llvm.org/D95495
This commit is contained in:
parent
04767b59b5
commit
684c703600
@ -1245,6 +1245,28 @@ void PGOUseFunc::setEdgeCount(DirectEdges &Edges, uint64_t Value) {
|
||||
llvm_unreachable("Cannot find the unknown count edge");
|
||||
}
|
||||
|
||||
// Emit function metadata indicating PGO profile mismatch.
|
||||
static void annotateFunctionWithHashMismatch(Function &F,
|
||||
LLVMContext &ctx) {
|
||||
const char MetadataName[] = "instr_prof_hash_mismatch";
|
||||
SmallVector<Metadata *, 2> Names;
|
||||
// If this metadata already exists, ignore.
|
||||
auto *Existing = F.getMetadata(LLVMContext::MD_annotation);
|
||||
if (Existing) {
|
||||
MDTuple *Tuple = cast<MDTuple>(Existing);
|
||||
for (auto &N : Tuple->operands()) {
|
||||
if (cast<MDString>(N.get())->getString() == MetadataName)
|
||||
return;
|
||||
Names.push_back(N.get());
|
||||
}
|
||||
}
|
||||
|
||||
MDBuilder MDB(ctx);
|
||||
Names.push_back(MDB.createString(MetadataName));
|
||||
MDNode *MD = MDTuple::get(ctx, Names);
|
||||
F.setMetadata(LLVMContext::MD_annotation, MD);
|
||||
}
|
||||
|
||||
// Read the profile from ProfileFileName and assign the value to the
|
||||
// instrumented BB and the edges. This function also updates ProgramMaxCount.
|
||||
// Return true if the profile are successfully read, and false on errors.
|
||||
@ -1272,6 +1294,8 @@ bool PGOUseFunc::readCounters(IndexedInstrProfReader *PGOReader, bool &AllZeros,
|
||||
(F.hasComdat() ||
|
||||
F.getLinkage() == GlobalValue::AvailableExternallyLinkage));
|
||||
LLVM_DEBUG(dbgs() << "hash mismatch (skip=" << SkipWarning << ")");
|
||||
// Emit function metadata indicating PGO profile mismatch.
|
||||
annotateFunctionWithHashMismatch(F, M->getContext());
|
||||
}
|
||||
|
||||
LLVM_DEBUG(dbgs() << " IsCS=" << IsCS << "\n");
|
||||
|
@ -0,0 +1,17 @@
|
||||
:ir
|
||||
:entry_first
|
||||
foo
|
||||
# Func Hash:
|
||||
11111
|
||||
# Num Counters:
|
||||
1
|
||||
# Counter Values:
|
||||
100
|
||||
|
||||
bar
|
||||
# Func Hash:
|
||||
11111
|
||||
# Num Counters:
|
||||
1
|
||||
# Counter Values:
|
||||
100
|
18
test/Transforms/PGOProfile/hash_mismatch_metadata.ll
Normal file
18
test/Transforms/PGOProfile/hash_mismatch_metadata.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llvm-profdata merge %S/Inputs/hash_mismatch_metadata.proftext -o %t.profdata
|
||||
; RUN: opt < %s -mtriple=x86_64-linux-gnu -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s
|
||||
|
||||
define void @foo() !annotation !1 {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @bar() !annotation !2 {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
!1 = !{!"fake_metadata"}
|
||||
!2 = !{!"instr_prof_hash_mismatch"}
|
||||
|
||||
; CHECK-DAG: !{{[0-9]+}} = !{!"fake_metadata", !"instr_prof_hash_mismatch"}
|
||||
; CHECK-DAG: !{{[0-9]+}} = !{!"instr_prof_hash_mismatch"}
|
Loading…
Reference in New Issue
Block a user