summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDehao Chen <dehao@google.com>2016-02-22 22:14:14 +0000
committerDehao Chen <dehao@google.com>2016-02-22 22:14:14 +0000
commitc5f76f73474499012b9559e917ec2368b659618a (patch)
tree276b18aedfce76a058ea6cfcea03b513337958de /llvm/lib
parent9b4880e7ecafafcbd8ca749f5985df31340e075f (diff)
downloadbcm5719-llvm-c5f76f73474499012b9559e917ec2368b659618a.tar.gz
bcm5719-llvm-c5f76f73474499012b9559e917ec2368b659618a.zip
Add prefix based function layout when profile is available.
Summary: If a function is hot, put it in text.hot section. Reviewers: davidxl Subscribers: eraman, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D17460 llvm-svn: 261582
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp16
-rw-r--r--llvm/lib/ProfileData/ProfileSummary.cpp21
2 files changed, 37 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 81b429a8d11..624eaec73b4 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -34,6 +34,7 @@
#include "llvm/MC/MCSymbolELF.h"
#include "llvm/MC/MCValue.h"
#include "llvm/ProfileData/InstrProf.h"
+#include "llvm/ProfileData/ProfileCommon.h"
#include "llvm/Support/COFF.h"
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/ELF.h"
@@ -244,6 +245,11 @@ static StringRef getSectionPrefixForGlobal(SectionKind Kind) {
return ".data.rel.ro";
}
+static cl::opt<bool> GroupFunctionsByHotness(
+ "group-functions-by-hotness",
+ llvm::cl::desc("Partition hot/cold functions by sections prefix"),
+ cl::init(false));
+
static MCSectionELF *
selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
SectionKind Kind, Mangler &Mang,
@@ -294,6 +300,16 @@ selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV,
Name = getSectionPrefixForGlobal(Kind);
}
+ if (GroupFunctionsByHotness) {
+ if (const Function *F = dyn_cast<Function>(GV)) {
+ if (ProfileSummary::isFunctionHot(F)) {
+ Name += getHotSectionPrefix();
+ } else if (ProfileSummary::isFunctionUnlikely(F)) {
+ Name += getUnlikelySectionPrefix();
+ }
+ }
+ }
+
if (EmitUniqueSection && UniqueSectionNames) {
Name.push_back('.');
TM.getNameWithPrefix(Name, GV, Mang, true);
diff --git a/llvm/lib/ProfileData/ProfileSummary.cpp b/llvm/lib/ProfileData/ProfileSummary.cpp
index 0e2c43e5e91..0363fbfe42d 100644
--- a/llvm/lib/ProfileData/ProfileSummary.cpp
+++ b/llvm/lib/ProfileData/ProfileSummary.cpp
@@ -11,6 +11,9 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/IR/Attributes.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Module.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/ProfileCommon.h"
#include "llvm/ProfileData/SampleProf.h"
@@ -75,6 +78,24 @@ void ProfileSummary::computeDetailedSummary() {
}
}
+// Returns true if the function is a hot function.
+bool ProfileSummary::isFunctionHot(const Function *F) {
+ // FIXME: update when summary data is stored in module's metadata.
+ return false;
+}
+
+// Returns true if the function is a cold function.
+bool ProfileSummary::isFunctionUnlikely(const Function *F) {
+ if (F->hasFnAttribute(Attribute::Cold)) {
+ return true;
+ }
+ if (!F->getEntryCount()) {
+ return false;
+ }
+ // FIXME: update when summary data is stored in module's metadata.
+ return (*F->getEntryCount()) == 0;
+}
+
InstrProfSummary::InstrProfSummary(const IndexedInstrProf::Summary &S)
: ProfileSummary(), MaxInternalBlockCount(S.get(
IndexedInstrProf::Summary::MaxInternalBlockCount)),
OpenPOWER on IntegriCloud