forked from OSchip/llvm-project
[PGO] Fix computation of function Hash
Previous implementation was incorrectly passing an uint64_t, that got converted to an uint8_t, to finalize the hash computation. This led to different functions having the same hash if they only differ by the remaining statements, which is incorrect. Added a new test case that trivially tests that a small function change is reflected in the hash value. Not that as this patch fixes the hash computation, it invalidates all hashes computed before that patch applies, which could be an issue for large build system that pre-compute the profile data and let client download them as part of the build process. Differential Revision: https://reviews.llvm.org/D79961
This commit is contained in:
parent
3c6c2ecd6e
commit
7c298c104b
|
@ -747,13 +747,15 @@ uint64_t PGOHash::finalize() {
|
|||
return Working;
|
||||
|
||||
// Check for remaining work in Working.
|
||||
if (Working)
|
||||
MD5.update(Working);
|
||||
if (Working) {
|
||||
using namespace llvm::support;
|
||||
uint64_t Swapped = endian::byte_swap<uint64_t, little>(Working);
|
||||
MD5.update(llvm::makeArrayRef((uint8_t *)&Swapped, sizeof(Swapped)));
|
||||
}
|
||||
|
||||
// Finalize the MD5 and return the hash.
|
||||
llvm::MD5::MD5Result Result;
|
||||
MD5.final(Result);
|
||||
using namespace llvm::support;
|
||||
return Result.low();
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// Test that a slight change in the code leads to a different hash.
|
||||
// RUN: %clang_cc1 -UEXTRA -triple x86_64-unknown-linux-gnu -main-file-name c-collision.c %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s --check-prefix=CHECK-NOEXTRA
|
||||
// RUN: %clang_cc1 -DEXTRA -triple x86_64-unknown-linux-gnu -main-file-name c-collision.c %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck %s --check-prefix=CHECK-EXTRA
|
||||
|
||||
// CHECK-NOEXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 7156072912471487002,
|
||||
// CHECK-EXTRA: @__profd_foo = private global { {{.*}} } { i64 6699318081062747564, i64 -4383447408116050035,
|
||||
|
||||
extern int bar;
|
||||
void foo() {
|
||||
if (bar) {
|
||||
}
|
||||
if (bar) {
|
||||
}
|
||||
if (bar) {
|
||||
if (bar) {
|
||||
#ifdef EXTRA
|
||||
if (bar) {
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue