From c8dba682bba9c80654d7a10331f718da9b7b0475 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 24 Oct 2018 18:53:47 +0000 Subject: [hot-cold-split] Name split functions with ".cold" suffix Summary: The current default of appending "_"+entry block label to the new extracted cold function breaks demangling. Change the deliminator from "_" to "." to enable demangling. Because the header block label will be empty for release compile code, use "extracted" after the "." when the label is empty. Additionally, add a mechanism for the client to pass in an alternate suffix applied after the ".", and have the hot cold split pass use "cold."+Count, where the Count is currently 1 but can be used to uniquely number multiple cold functions split out from the same function with D53588. Reviewers: sebpop, hiraditya Subscribers: llvm-commits, erik.pilkington Differential Revision: https://reviews.llvm.org/D53534 llvm-svn: 345178 --- llvm/lib/Transforms/IPO/HotColdSplitting.cpp | 16 +++++++++------- llvm/lib/Transforms/Utils/CodeExtractor.cpp | 16 +++++++++++----- 2 files changed, 20 insertions(+), 12 deletions(-) (limited to 'llvm/lib') diff --git a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp index d3e086e972a..a63cd842241 100644 --- a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp +++ b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp @@ -265,7 +265,7 @@ private: DominatorTree *DT, PostDomTree *PDT); Function *extractColdRegion(const SmallVectorImpl &Region, DominatorTree *DT, BlockFrequencyInfo *BFI, - OptimizationRemarkEmitter &ORE); + OptimizationRemarkEmitter &ORE, unsigned Count); bool isOutlineCandidate(const SmallVectorImpl &Region, const BasicBlock *Exit) const { if (!Exit) @@ -331,16 +331,18 @@ bool HotColdSplitting::shouldOutlineFrom(const Function &F) const { return true; } -Function * -HotColdSplitting::extractColdRegion(const SmallVectorImpl &Region, - DominatorTree *DT, BlockFrequencyInfo *BFI, - OptimizationRemarkEmitter &ORE) { +Function *HotColdSplitting::extractColdRegion( + const SmallVectorImpl &Region, DominatorTree *DT, + BlockFrequencyInfo *BFI, OptimizationRemarkEmitter &ORE, unsigned Count) { assert(!Region.empty()); LLVM_DEBUG(for (auto *BB : Region) llvm::dbgs() << "\nExtracting: " << *BB;); // TODO: Pass BFI and BPI to update profile information. - CodeExtractor CE(Region, DT); + CodeExtractor CE(Region, DT, /* AggregateArgs */ false, /* BFI */ nullptr, + /* BPI */ nullptr, /* AllowVarArgs */ false, + /* AllowAlloca */ false, + /* Suffix */ "cold." + std::to_string(Count)); SetVector Inputs, Outputs, Sinks; CE.findInputsOutputs(Inputs, Outputs, Sinks); @@ -426,7 +428,7 @@ const Function *HotColdSplitting::outlineColdBlocks(Function &F, ++NumColdSESEFound; ValidColdRegion.push_back(ExitColdRegion); // Candidate for outlining. FIXME: Continue outlining. - return extractColdRegion(ValidColdRegion, DT, BFI, ORE); + return extractColdRegion(ValidColdRegion, DT, BFI, ORE, /* Count */ 1); } } } diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp index 27b982578c4..328fe1fac65 100644 --- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -228,19 +228,21 @@ buildExtractionBlockSet(ArrayRef BBs, DominatorTree *DT, CodeExtractor::CodeExtractor(ArrayRef BBs, DominatorTree *DT, bool AggregateArgs, BlockFrequencyInfo *BFI, BranchProbabilityInfo *BPI, bool AllowVarArgs, - bool AllowAlloca) + bool AllowAlloca, std::string Suffix) : DT(DT), AggregateArgs(AggregateArgs || AggregateArgsOpt), BFI(BFI), BPI(BPI), AllowVarArgs(AllowVarArgs), - Blocks(buildExtractionBlockSet(BBs, DT, AllowVarArgs, AllowAlloca)) {} + Blocks(buildExtractionBlockSet(BBs, DT, AllowVarArgs, AllowAlloca)), + Suffix(Suffix) {} CodeExtractor::CodeExtractor(DominatorTree &DT, Loop &L, bool AggregateArgs, BlockFrequencyInfo *BFI, - BranchProbabilityInfo *BPI) + BranchProbabilityInfo *BPI, std::string Suffix) : DT(&DT), AggregateArgs(AggregateArgs || AggregateArgsOpt), BFI(BFI), BPI(BPI), AllowVarArgs(false), Blocks(buildExtractionBlockSet(L.getBlocks(), &DT, /* AllowVarArgs */ false, - /* AllowAlloca */ false)) {} + /* AllowAlloca */ false)), + Suffix(Suffix) {} /// definedInRegion - Return true if the specified value is defined in the /// extracted region. @@ -669,10 +671,14 @@ Function *CodeExtractor::constructFunction(const ValueSet &inputs, FunctionType::get(RetTy, paramTy, AllowVarArgs && oldFunction->isVarArg()); + std::string SuffixToUse = + Suffix.empty() + ? (header->getName().empty() ? "extracted" : header->getName().str()) + : Suffix; // Create the new function Function *newFunction = Function::Create( funcType, GlobalValue::InternalLinkage, oldFunction->getAddressSpace(), - oldFunction->getName() + "_" + header->getName(), M); + oldFunction->getName() + "." + SuffixToUse, M); // If the old function is no-throw, so is the new one. if (oldFunction->doesNotThrow()) newFunction->setDoesNotThrow(); -- cgit v1.2.3