From 42e1f3ffdabd992dce56017c8b040aad9450d6ba Mon Sep 17 00:00:00 2001 From: Easwaran Raman Date: Thu, 17 Dec 2015 19:14:27 +0000 Subject: [PATCH] Attach maximum function count to Module when using PGO mode. This sets the maximum entry count among all functions in the program to the module using module flags. This allows the optimizer to use this information. Differential Revision: http://reviews.llvm.org/D15163 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255918 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 7 +++-- .../Inputs/max-function-count.proftext | 26 +++++++++++++++++++ test/Profile/max-function-count.c | 24 +++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/Profile/Inputs/max-function-count.proftext create mode 100644 test/Profile/max-function-count.c diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 3b3fc877bf..173b0dcba1 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -375,8 +375,11 @@ void CodeGenModule::Release() { if (llvm::Function *CudaDtorFunction = CUDARuntime->makeModuleDtorFunction()) AddGlobalDtor(CudaDtorFunction); } - if (PGOReader && PGOStats.hasDiagnostics()) - PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName); + if (PGOReader) { + getModule().setMaximumFunctionCount(PGOReader->getMaximumFunctionCount()); + if (PGOStats.hasDiagnostics()) + PGOStats.reportDiagnostics(getDiags(), getCodeGenOpts().MainFileName); + } EmitCtorList(GlobalCtors, "llvm.global_ctors"); EmitCtorList(GlobalDtors, "llvm.global_dtors"); EmitGlobalAnnotations(); diff --git a/test/Profile/Inputs/max-function-count.proftext b/test/Profile/Inputs/max-function-count.proftext new file mode 100644 index 0000000000..c744f7af9d --- /dev/null +++ b/test/Profile/Inputs/max-function-count.proftext @@ -0,0 +1,26 @@ +begin +# Func Hash: +10 +# Num Counters: +2 +# Counter Values: +1 +0 + +main +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +1 + +end +# Func Hash: +10 +# Num Counters: +2 +# Counter Values: +2 +2 + diff --git a/test/Profile/max-function-count.c b/test/Profile/max-function-count.c new file mode 100644 index 0000000000..39490d7b27 --- /dev/null +++ b/test/Profile/max-function-count.c @@ -0,0 +1,24 @@ +// Test that maximum function counts are set correctly. + +// RUN: llvm-profdata merge %S/Inputs/max-function-count.proftext -o %t.profdata +// RUN: %clang %s -o - -mllvm -disable-llvm-optzns -emit-llvm -S -fprofile-instr-use=%t.profdata | FileCheck %s +// +int begin(int i) { + if (i) + return 0; + return 1; +} + +int end(int i) { + if (i) + return 0; + return 1; +} + +int main(int argc, const char *argv[]) { + begin(0); + end(1); + end(1); + return 0; +} +// CHECK: !{{[0-9]+}} = !{i32 1, !"MaxFunctionCount", i32 2} -- 2.50.1