]> granicus.if.org Git - llvm/commitdiff
[PGO] Fix handling of cold entry count for instrumented PGO
authorTeresa Johnson <tejohnson@google.com>
Mon, 18 Dec 2017 20:02:43 +0000 (20:02 +0000)
committerTeresa Johnson <tejohnson@google.com>
Mon, 18 Dec 2017 20:02:43 +0000 (20:02 +0000)
Summary:
In r277849, getEntryCount was changed to return None when the entry
count was 0, specifically for SamplePGO where it means no samples were
recorded. However, for instrumentation PGO a 0 entry count should be
returned directly, since it does mean that the function was completely
cold. Otherwise we end up treating these functions conservatively
in isFunctionEntryCold() and isColdBB().

Instead, for SamplePGO use -1 when there are no samples, and change
getEntryCount to return None when the value is -1.

Reviewers: danielcdh, davidxl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D41307

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321018 91177308-0d34-0410-b5e6-96231b3b80d8

lib/IR/Function.cpp
lib/Transforms/IPO/SampleProfile.cpp
test/Transforms/SampleProfile/entry_counts.ll

index 1fff912ecf2f5c6665940396c087bc0b115dd77d..7063f6f40a3058de6c761dd951fbe638c99192a4 100644 (file)
@@ -1333,7 +1333,9 @@ Optional<uint64_t> Function::getEntryCount() const {
       if (MDS->getString().equals("function_entry_count")) {
         ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(1));
         uint64_t Count = CI->getValue().getZExtValue();
-        if (Count == 0)
+        // A value of -1 is used for SamplePGO when there were no samples.
+        // Treat this the same as unknown.
+        if (Count == (uint64_t)-1)
           return None;
         return Count;
       }
index f0e781b9d923b0738b66db43c9eb3d0d99070440..7086c2eb52c40dda95d8a0fcb8caee05055f147d 100644 (file)
@@ -1583,7 +1583,10 @@ bool SampleProfileLoaderLegacyPass::runOnModule(Module &M) {
 }
 
 bool SampleProfileLoader::runOnFunction(Function &F, ModuleAnalysisManager *AM) {
-  F.setEntryCount(0);
+  // Initialize the entry count to -1, which will be treated conservatively
+  // by getEntryCount as the same as unknown (None). If we have samples this
+  // will be overwritten in emitAnnotations.
+  F.setEntryCount(-1);
   std::unique_ptr<OptimizationRemarkEmitter> OwnedORE;
   if (AM) {
     auto &FAM =
index 6137a6908cf536e4f9688be6e21bf90fcf3f03f4..cab7c87e04932b35aeded4987e4e79dde9282fb5 100644 (file)
@@ -9,8 +9,8 @@ entry:
   ret void, !dbg !9
 }
 
-; This function does not have profile, check if function_entry_count is 0
-; CHECK: {{.*}} = !{!"function_entry_count", i64 0}
+; This function does not have profile, check if function_entry_count is -1
+; CHECK: {{.*}} = !{!"function_entry_count", i64 -1}
 define void @no_profile() {
 entry:
   ret void