Index: llvm/include/llvm/ProfileData/InstrProf.h =================================================================== --- llvm/include/llvm/ProfileData/InstrProf.h +++ llvm/include/llvm/ProfileData/InstrProf.h @@ -784,6 +784,8 @@ OverlapStats &Overlap, OverlapStats &FuncLevelOverlap); + void normalizeData(uint64_t MinValue, bool ClampToPow2); + private: struct ValueProfData { std::vector IndirectCallSites; Index: llvm/include/llvm/ProfileData/InstrProfWriter.h =================================================================== --- llvm/include/llvm/ProfileData/InstrProfWriter.h +++ llvm/include/llvm/ProfileData/InstrProfWriter.h @@ -106,6 +106,8 @@ OverlapStats &FuncLevelOverlap, const OverlapFuncFilters &FuncFilter); + void normalizeData(uint64_t MinValue, bool ClampToPow2); + private: void addRecord(StringRef Name, uint64_t Hash, InstrProfRecord &&I, uint64_t Weight, function_ref Warn); Index: llvm/lib/ProfileData/InstrProf.cpp =================================================================== --- llvm/lib/ProfileData/InstrProf.cpp +++ llvm/lib/ProfileData/InstrProf.cpp @@ -551,6 +551,15 @@ FuncLevelOverlap); } +void InstrProfRecord::normalizeData(uint64_t MinValue, bool ClampToPow2) { + for (auto& counter : Counts) { + if (counter < MinValue) + counter = 0; + else if (ClampToPow2) + counter = std::pow(2, std::floor(std::log2(counter))); + } +} + void InstrProfRecord::overlap(InstrProfRecord &Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff) { Index: llvm/lib/ProfileData/InstrProfWriter.cpp =================================================================== --- llvm/lib/ProfileData/InstrProfWriter.cpp +++ llvm/lib/ProfileData/InstrProfWriter.cpp @@ -221,6 +221,13 @@ Dest.overlap(Other, Overlap, FuncLevelOverlap, ValueCutoff); } +void InstrProfWriter::normalizeData(uint64_t MinValue, bool ClampToPow2) { + for (auto& F : FunctionData) + for (auto& I : F.getValue()) { + I.getSecond().normalizeData(MinValue, ClampToPow2); + } +} + void InstrProfWriter::addRecord(StringRef Name, uint64_t Hash, InstrProfRecord &&I, uint64_t Weight, function_ref Warn) { Index: llvm/tools/llvm-profdata/llvm-profdata.cpp =================================================================== --- llvm/tools/llvm-profdata/llvm-profdata.cpp +++ llvm/tools/llvm-profdata/llvm-profdata.cpp @@ -371,6 +371,7 @@ exitWithErrorCode(EC, OutputFilename); InstrProfWriter &Writer = Contexts[0]->Writer; + Writer.normalizeData(20, true); if (OutputFormat == PF_Text) { if (Error E = Writer.writeText(Output)) exitWithError(std::move(E)); Index: llvm/utils/gn/build/libs/zlib/BUILD.gn =================================================================== --- llvm/utils/gn/build/libs/zlib/BUILD.gn +++ llvm/utils/gn/build/libs/zlib/BUILD.gn @@ -2,7 +2,12 @@ config("zlib_config") { visibility = [ ":zlib" ] - libs = [ "z" ] + if (host_os == "win") { + include_dirs = [ "C:\\src\\chrome\\src\\third_party\\llvm-build-tools\\zlib-1.2.11" ] + libs = [ "C:\\src\\chrome\\src\\third_party\\llvm-build-tools\\zlib-1.2.11\\zlib.lib" ] + } else { + libs = [ "z" ] + } } group("zlib") { Index: llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn =================================================================== --- llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn +++ llvm/utils/gn/secondary/llvm/include/llvm/Config/BUILD.gn @@ -202,7 +202,7 @@ "HAVE_ISATTY=", "HAVE_LIBPTHREAD=", "HAVE_PTHREAD_SETNAME_NP=", - "HAVE_LIBZ=", + "HAVE_LIBZ=1", "HAVE_PREAD=", "HAVE_PTHREAD_GETSPECIFIC=", "HAVE_PTHREAD_H=", @@ -221,7 +221,7 @@ "HAVE_SYS_TIME_H=", "HAVE_TERMIOS_H=", "HAVE_UNISTD_H=", - "HAVE_ZLIB_H=", + "HAVE_ZLIB_H=1", "HAVE__CHSIZE_S=1", "HAVE__UNWIND_BACKTRACE=", "stricmp=_stricmp",