]> granicus.if.org Git - llvm/commitdiff
[HotColdSplit] Calculate BFI lazily to reduce compile-time, NFC
authorVedant Kumar <vsk@apple.com>
Tue, 22 Jan 2019 22:49:22 +0000 (22:49 +0000)
committerVedant Kumar <vsk@apple.com>
Tue, 22 Jan 2019 22:49:22 +0000 (22:49 +0000)
The splitting pass does not need BFI unless the Module actually has a profile
summary. Do not calcualte BFI unless the summary is present.

For the sqlite3 amalgamation, this reduces time spent in the splitting pass
from 0.4% of the total to under 0.1%.

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

lib/Transforms/IPO/HotColdSplitting.cpp

index eda96710b9595285078ef02726a83a9f79a871b3..c5eb23c6a16261f605040878054c47d2085c3fbb 100644 (file)
@@ -176,7 +176,7 @@ public:
 private:
   bool isFunctionCold(const Function &F) const;
   bool shouldOutlineFrom(const Function &F) const;
-  bool outlineColdRegions(Function &F);
+  bool outlineColdRegions(Function &F, bool HasProfileSummary);
   Function *extractColdRegion(const BlockSequence &Region, DominatorTree &DT,
                               BlockFrequencyInfo *BFI, TargetTransformInfo &TTI,
                               OptimizationRemarkEmitter &ORE, unsigned Count);
@@ -448,7 +448,7 @@ public:
 };
 } // namespace
 
-bool HotColdSplitting::outlineColdRegions(Function &F) {
+bool HotColdSplitting::outlineColdRegions(Function &F, bool HasProfileSummary) {
   bool Changed = false;
 
   // The set of cold blocks.
@@ -466,7 +466,13 @@ bool HotColdSplitting::outlineColdRegions(Function &F) {
   std::unique_ptr<DominatorTree> DT;
   std::unique_ptr<PostDominatorTree> PDT;
 
-  BlockFrequencyInfo *BFI = GetBFI(F);
+  // Calculate BFI lazily (it's only used to query ProfileSummaryInfo). This
+  // reduces compile-time significantly. TODO: When we *do* use BFI, we should
+  // be able to salvage its domtrees instead of recomputing them.
+  BlockFrequencyInfo *BFI = nullptr;
+  if (HasProfileSummary)
+    BFI = GetBFI(F);
+
   TargetTransformInfo &TTI = GetTTI(F);
   OptimizationRemarkEmitter &ORE = (*GetORE)(F);
 
@@ -476,7 +482,7 @@ bool HotColdSplitting::outlineColdRegions(Function &F) {
     if (ColdBlocks.count(BB))
       continue;
 
-    bool Cold = PSI->isColdBlock(BB, BFI) ||
+    bool Cold = (BFI && PSI->isColdBlock(BB, BFI)) ||
                 (EnableStaticAnalyis && unlikelyExecuted(*BB));
     if (!Cold)
       continue;
@@ -550,6 +556,7 @@ bool HotColdSplitting::outlineColdRegions(Function &F) {
 
 bool HotColdSplitting::run(Module &M) {
   bool Changed = false;
+  bool HasProfileSummary = M.getProfileSummary();
   for (auto It = M.begin(), End = M.end(); It != End; ++It) {
     Function &F = *It;
 
@@ -573,7 +580,7 @@ bool HotColdSplitting::run(Module &M) {
     }
 
     LLVM_DEBUG(llvm::dbgs() << "Outlining in " << F.getName() << "\n");
-    Changed |= outlineColdRegions(F);
+    Changed |= outlineColdRegions(F, HasProfileSummary);
   }
   return Changed;
 }