From 08b86793476e08fc0937e70058e2a94808c988e7 Mon Sep 17 00:00:00 2001 From: Dehao Chen Date: Mon, 6 Mar 2017 17:49:59 +0000 Subject: [PATCH] Remove the sample pgo annotation heuristic that uses call count to annotate basic block count. Summary: We do not need that special handling because the debug info is more accurate now. Performance testing shows no regression on google internal benchmarks. Reviewers: davidxl, aprantl Reviewed By: aprantl Subscribers: llvm-commits, aprantl Differential Revision: https://reviews.llvm.org/D30658 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297038 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/SampleProf.h | 15 --------------- lib/Transforms/IPO/SampleProfile.cpp | 8 +++----- test/Transforms/SampleProfile/calls.ll | 8 ++++---- test/Transforms/SampleProfile/fnptr.ll | 8 ++++---- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/include/llvm/ProfileData/SampleProf.h b/include/llvm/ProfileData/SampleProf.h index 1fd8c417505..a35ae4f92bd 100644 --- a/include/llvm/ProfileData/SampleProf.h +++ b/include/llvm/ProfileData/SampleProf.h @@ -240,21 +240,6 @@ public: return ret->second.getSamples(); } - /// Return the total number of call target samples collected at a given - /// location. Each location is specified by \p LineOffset and - /// \p Discriminator. If the location is not found in profile, return error. - ErrorOr findCallSamplesAt(uint32_t LineOffset, - uint32_t Discriminator) const { - const auto &ret = BodySamples.find(LineLocation(LineOffset, Discriminator)); - if (ret == BodySamples.end()) - return std::error_code(); - uint64_t T = 0; - for (const auto &t_c : ret->second.getCallTargets()) { - T += t_c.second; - } - return T; - } - /// Returns the call target map collected at a given location. /// Each location is specified by \p LineOffset and \p Discriminator. /// If the location is not found in profile, return error. diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index a9f5b0333c5..802347e819b 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -469,16 +469,14 @@ ErrorOr SampleProfileLoader::getInstWeight(const Instruction &Inst) { // If a call/invoke instruction is inlined in profile, but not inlined here, // it means that the inlined callsite has no sample, thus the call // instruction should have 0 count. - bool IsCall = isa(Inst) || isa(Inst); - if (IsCall && findCalleeFunctionSamples(Inst)) + if ((isa(Inst) || isa(Inst)) && + findCalleeFunctionSamples(Inst)) return 0; const DILocation *DIL = DLoc; uint32_t LineOffset = getOffset(DIL); uint32_t Discriminator = DIL->getBaseDiscriminator(); - ErrorOr R = IsCall - ? FS->findCallSamplesAt(LineOffset, Discriminator) - : FS->findSamplesAt(LineOffset, Discriminator); + ErrorOr R = FS->findSamplesAt(LineOffset, Discriminator); if (R) { bool FirstMark = CoverageTracker.markSamplesUsed(FS, LineOffset, Discriminator, R.get()); diff --git a/test/Transforms/SampleProfile/calls.ll b/test/Transforms/SampleProfile/calls.ll index faf0f2c1e83..3539c771627 100644 --- a/test/Transforms/SampleProfile/calls.ll +++ b/test/Transforms/SampleProfile/calls.ll @@ -48,8 +48,8 @@ while.cond: ; preds = %if.end, %entry store i32 %inc, i32* %i, align 4, !dbg !14 %cmp = icmp slt i32 %0, 400000000, !dbg !14 br i1 %cmp, label %while.body, label %while.end, !dbg !14 -; CHECK: edge while.cond -> while.body probability is 0x75bcbf1b / 0x80000000 = 91.98% [HOT edge] -; CHECK: edge while.cond -> while.end probability is 0x0a4340e5 / 0x80000000 = 8.02% +; CHECK: edge while.cond -> while.body probability is 0x77f2798d / 0x80000000 = 93.71% [HOT edge] +; CHECK: edge while.cond -> while.end probability is 0x080d8673 / 0x80000000 = 6.29% while.body: ; preds = %while.cond %1 = load i32, i32* %i, align 4, !dbg !16 @@ -59,8 +59,8 @@ while.body: ; preds = %while.cond ; both branches out of while.body had the same weight. In reality, ; the edge while.body->if.then is taken most of the time. ; -; CHECK: edge while.body -> if.else probability is 0x00059704 / 0x80000000 = 0.02% -; CHECK: edge while.body -> if.then probability is 0x7ffa68fc / 0x80000000 = 99.98% [HOT edge] +; CHECK: edge while.body -> if.else probability is 0x0005b1e0 / 0x80000000 = 0.02% +; CHECK: edge while.body -> if.then probability is 0x7ffa4e20 / 0x80000000 = 99.98% [HOT edge] if.then: ; preds = %while.body diff --git a/test/Transforms/SampleProfile/fnptr.ll b/test/Transforms/SampleProfile/fnptr.ll index 0c671a7882f..1b01d0c0c85 100644 --- a/test/Transforms/SampleProfile/fnptr.ll +++ b/test/Transforms/SampleProfile/fnptr.ll @@ -8,10 +8,10 @@ ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/fnptr.prof | opt -analyze -branch-prob | FileCheck %s ; RUN: opt < %s -passes=sample-profile -sample-profile-file=%S/Inputs/fnptr.binprof | opt -analyze -branch-prob | FileCheck %s -; CHECK: edge for.body3 -> if.then probability is 0x19f584f3 / 0x80000000 = 20.28% -; CHECK: edge for.body3 -> if.else probability is 0x660a7b0d / 0x80000000 = 79.72% -; CHECK: edge for.inc -> for.inc12 probability is 0x000f92fb / 0x80000000 = 0.05% -; CHECK: edge for.inc -> for.body3 probability is 0x7ff06d05 / 0x80000000 = 99.95% +; CHECK: edge for.body3 -> if.then probability is 0x1a56a56a / 0x80000000 = 20.58% +; CHECK: edge for.body3 -> if.else probability is 0x65a95a96 / 0x80000000 = 79.42% +; CHECK: edge for.inc -> for.inc12 probability is 0x000fbd1c / 0x80000000 = 0.05% +; CHECK: edge for.inc -> for.body3 probability is 0x7ff042e4 / 0x80000000 = 99.95% ; CHECK: edge for.inc12 -> for.end14 probability is 0x04000000 / 0x80000000 = 3.12% ; CHECK: edge for.inc12 -> for.cond1.preheader probability is 0x7c000000 / 0x80000000 = 96.88% -- 2.50.1