From: Florian Hahn Date: Thu, 24 Jan 2019 09:44:52 +0000 (+0000) Subject: [HotColdSplitting] Get DT and PDT from the pass manager. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=442573a8e66dcc817ebeabf58f3611b384ac973d;p=llvm [HotColdSplitting] Get DT and PDT from the pass manager. Instead of manually computing DT and PDT, we can get the from the pass manager, which ideally has them already cached. With the new pass manager, we could even preserve DT/PDT on a per function basis in a module pass. I think this also addresses the TODO about re-using the computed DTs for BFI. IIUC, GetBFI will fetch the DT from the pass manager and when we will fetch the cached version later. Reviewers: vsk, hiraditya, tejohnson, thegameg, sebpop Reviewed By: vsk Differential Revision: https://reviews.llvm.org/D57092 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352036 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/HotColdSplitting.cpp b/lib/Transforms/IPO/HotColdSplitting.cpp index 710a9e72569..0ff902d735c 100644 --- a/lib/Transforms/IPO/HotColdSplitting.cpp +++ b/lib/Transforms/IPO/HotColdSplitting.cpp @@ -168,8 +168,11 @@ public: HotColdSplitting(ProfileSummaryInfo *ProfSI, function_ref GBFI, function_ref GTTI, + function_ref GetDT, + function_ref GetPDT, std::function *GORE) - : PSI(ProfSI), GetBFI(GBFI), GetTTI(GTTI), GetORE(GORE) {} + : PSI(ProfSI), GetBFI(GBFI), GetTTI(GTTI), GetDT(GetDT), GetPDT(GetPDT), + GetORE(GORE) {} bool run(Module &M); private: @@ -182,6 +185,8 @@ private: ProfileSummaryInfo *PSI; function_ref GetBFI; function_ref GetTTI; + function_ref GetDT; + function_ref GetPDT; std::function *GetORE; }; @@ -195,6 +200,8 @@ public: void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired(); AU.addRequired(); + AU.addRequired(); + AU.addRequired(); AU.addRequired(); AU.addRequired(); } @@ -462,12 +469,11 @@ bool HotColdSplitting::outlineColdRegions(Function &F, bool HasProfileSummary) { ReversePostOrderTraversal RPOT(&F); // Calculate domtrees lazily. This reduces compile-time significantly. - std::unique_ptr DT; - std::unique_ptr PDT; + DominatorTree *DT = nullptr; + PostDominatorTree *PDT = nullptr; // 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. + // reduces compile-time significantly. BlockFrequencyInfo *BFI = nullptr; if (HasProfileSummary) BFI = GetBFI(F); @@ -492,9 +498,9 @@ bool HotColdSplitting::outlineColdRegions(Function &F, bool HasProfileSummary) { }); if (!DT) - DT = make_unique(F); + DT = GetDT(F); if (!PDT) - PDT = make_unique(F); + PDT = GetPDT(F); auto Region = OutliningRegion::create(*BB, *DT, *PDT); if (Region.empty()) @@ -595,6 +601,13 @@ bool HotColdSplittingLegacyPass::runOnModule(Module &M) { auto GBFI = [this](Function &F) { return &this->getAnalysis(F).getBFI(); }; + auto GetDT = [this](Function &F) { + return &this->getAnalysis(F).getDomTree(); + }; + auto GetPDT = [this](Function &F) { + return &this->getAnalysis(F).getPostDomTree(); + }; + std::unique_ptr ORE; std::function GetORE = [&ORE](Function &F) -> OptimizationRemarkEmitter & { @@ -602,7 +615,7 @@ bool HotColdSplittingLegacyPass::runOnModule(Module &M) { return *ORE.get(); }; - return HotColdSplitting(PSI, GBFI, GTTI, &GetORE).run(M); + return HotColdSplitting(PSI, GBFI, GTTI, GetDT, GetPDT, &GetORE).run(M); } PreservedAnalyses @@ -623,6 +636,14 @@ HotColdSplittingPass::run(Module &M, ModuleAnalysisManager &AM) { return FAM.getResult(F); }; + auto GetDT = [&FAM](Function &F) { + return &FAM.getResult(F); + }; + + auto GetPDT = [&FAM](Function &F) { + return &FAM.getResult(F); + }; + std::unique_ptr ORE; std::function GetORE = [&ORE](Function &F) -> OptimizationRemarkEmitter & { @@ -632,7 +653,7 @@ HotColdSplittingPass::run(Module &M, ModuleAnalysisManager &AM) { ProfileSummaryInfo *PSI = &AM.getResult(M); - if (HotColdSplitting(PSI, GBFI, GTTI, &GetORE).run(M)) + if (HotColdSplitting(PSI, GBFI, GTTI, GetDT, GetPDT, &GetORE).run(M)) return PreservedAnalyses::none(); return PreservedAnalyses::all(); } @@ -642,6 +663,8 @@ INITIALIZE_PASS_BEGIN(HotColdSplittingLegacyPass, "hotcoldsplit", "Hot Cold Splitting", false, false) INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(BlockFrequencyInfoWrapperPass) +INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) +INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) INITIALIZE_PASS_END(HotColdSplittingLegacyPass, "hotcoldsplit", "Hot Cold Splitting", false, false)