003 File Manager
Current Path:
/usr/src/contrib/llvm-project/llvm/lib/Analysis
usr
/
src
/
contrib
/
llvm-project
/
llvm
/
lib
/
Analysis
/
📁
..
📄
AliasAnalysis.cpp
(33.55 KB)
📄
AliasAnalysisEvaluator.cpp
(15.64 KB)
📄
AliasAnalysisSummary.cpp
(3.49 KB)
📄
AliasAnalysisSummary.h
(10.17 KB)
📄
AliasSetTracker.cpp
(25.86 KB)
📄
Analysis.cpp
(5.29 KB)
📄
AssumeBundleQueries.cpp
(7.96 KB)
📄
AssumptionCache.cpp
(10.94 KB)
📄
BasicAliasAnalysis.cpp
(85.81 KB)
📄
BlockFrequencyInfo.cpp
(12.39 KB)
📄
BlockFrequencyInfoImpl.cpp
(28.6 KB)
📄
BranchProbabilityInfo.cpp
(43.48 KB)
📄
CFG.cpp
(9.9 KB)
📄
CFGPrinter.cpp
(11.2 KB)
📄
CFLAndersAliasAnalysis.cpp
(33.01 KB)
📄
CFLGraph.h
(21.23 KB)
📄
CFLSteensAliasAnalysis.cpp
(13.24 KB)
📄
CGSCCPassManager.cpp
(31.2 KB)
📄
CallGraph.cpp
(12.86 KB)
📄
CallGraphSCCPass.cpp
(26.31 KB)
📄
CallPrinter.cpp
(9.48 KB)
📄
CaptureTracking.cpp
(15.38 KB)
📄
CmpInstAnalysis.cpp
(4.63 KB)
📄
CodeMetrics.cpp
(6.99 KB)
📄
ConstantFolding.cpp
(105.15 KB)
📄
CostModel.cpp
(3.87 KB)
📄
DDG.cpp
(11.29 KB)
📄
Delinearization.cpp
(4.49 KB)
📄
DemandedBits.cpp
(16.27 KB)
📄
DependenceAnalysis.cpp
(150.78 KB)
📄
DependenceGraphBuilder.cpp
(19.24 KB)
📄
DivergenceAnalysis.cpp
(15.59 KB)
📄
DomPrinter.cpp
(9.67 KB)
📄
DomTreeUpdater.cpp
(15.21 KB)
📄
DominanceFrontier.cpp
(3.2 KB)
📄
EHPersonalities.cpp
(5.89 KB)
📄
GlobalsModRef.cpp
(41 KB)
📄
GuardUtils.cpp
(3.27 KB)
📄
HeatUtils.cpp
(2.85 KB)
📄
IVDescriptors.cpp
(42.28 KB)
📄
IVUsers.cpp
(16.12 KB)
📄
IndirectCallPromotionAnalysis.cpp
(4.33 KB)
📄
InlineAdvisor.cpp
(15.28 KB)
📄
InlineCost.cpp
(99.47 KB)
📄
InlineFeaturesAnalysis.cpp
(1.59 KB)
📄
InlineSizeEstimatorAnalysis.cpp
(10.95 KB)
📄
InstCount.cpp
(2.45 KB)
📄
InstructionPrecedenceTracking.cpp
(4.8 KB)
📄
InstructionSimplify.cpp
(216.91 KB)
📄
Interval.cpp
(1.78 KB)
📄
IntervalPartition.cpp
(4.5 KB)
📄
LazyBlockFrequencyInfo.cpp
(2.81 KB)
📄
LazyBranchProbabilityInfo.cpp
(2.96 KB)
📄
LazyCallGraph.cpp
(67.33 KB)
📄
LazyValueInfo.cpp
(76.38 KB)
📄
LegacyDivergenceAnalysis.cpp
(14.82 KB)
📄
Lint.cpp
(29.07 KB)
📄
Loads.cpp
(20.6 KB)
📄
LoopAccessAnalysis.cpp
(88.02 KB)
📄
LoopAnalysisManager.cpp
(6.6 KB)
📄
LoopCacheAnalysis.cpp
(23.53 KB)
📄
LoopInfo.cpp
(37.15 KB)
📄
LoopNestAnalysis.cpp
(10.62 KB)
📄
LoopPass.cpp
(12.89 KB)
📄
LoopUnrollAnalyzer.cpp
(7.26 KB)
📄
MLInlineAdvisor.cpp
(11.36 KB)
📄
MemDepPrinter.cpp
(5.13 KB)
📄
MemDerefPrinter.cpp
(2.53 KB)
📄
MemoryBuiltins.cpp
(41.14 KB)
📄
MemoryDependenceAnalysis.cpp
(69.89 KB)
📄
MemoryLocation.cpp
(7.92 KB)
📄
MemorySSA.cpp
(90.16 KB)
📄
MemorySSAUpdater.cpp
(57.9 KB)
📄
ModuleDebugInfoPrinter.cpp
(4.02 KB)
📄
ModuleSummaryAnalysis.cpp
(38.13 KB)
📄
MustExecute.cpp
(31.18 KB)
📄
ObjCARCAliasAnalysis.cpp
(5.81 KB)
📄
ObjCARCAnalysisUtils.cpp
(1.07 KB)
📄
ObjCARCInstKind.cpp
(23.15 KB)
📄
OptimizationRemarkEmitter.cpp
(4.23 KB)
📄
PHITransAddr.cpp
(16.05 KB)
📄
PhiValues.cpp
(8.4 KB)
📄
PostDominators.cpp
(3.59 KB)
📄
ProfileSummaryInfo.cpp
(18.07 KB)
📄
PtrUseVisitor.cpp
(1.28 KB)
📄
RegionInfo.cpp
(6.5 KB)
📄
RegionPass.cpp
(9.23 KB)
📄
RegionPrinter.cpp
(8.61 KB)
📄
ReleaseModeModelRunner.cpp
(2.83 KB)
📄
ScalarEvolution.cpp
(475.26 KB)
📄
ScalarEvolutionAliasAnalysis.cpp
(5.96 KB)
📄
ScalarEvolutionDivision.cpp
(7.51 KB)
📄
ScalarEvolutionNormalization.cpp
(4.59 KB)
📄
ScopedNoAliasAA.cpp
(7.38 KB)
📄
StackLifetime.cpp
(12.22 KB)
📄
StackSafetyAnalysis.cpp
(31.81 KB)
📄
StratifiedSets.h
(18.67 KB)
📄
SyncDependenceAnalysis.cpp
(12.97 KB)
📄
SyntheticCountsUtils.cpp
(3.81 KB)
📄
TFUtils.cpp
(8.99 KB)
📄
TargetLibraryInfo.cpp
(58.98 KB)
📄
TargetTransformInfo.cpp
(48.15 KB)
📄
Trace.cpp
(1.8 KB)
📄
TypeBasedAliasAnalysis.cpp
(26.04 KB)
📄
TypeMetadataUtils.cpp
(5.93 KB)
📄
VFABIDemangling.cpp
(16.46 KB)
📄
ValueLattice.cpp
(1.19 KB)
📄
ValueLatticeUtils.cpp
(1.53 KB)
📄
ValueTracking.cpp
(243.08 KB)
📄
VectorUtils.cpp
(48.57 KB)
📁
models
Editing: BlockFrequencyInfo.cpp
//===- BlockFrequencyInfo.cpp - Block Frequency Analysis ------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Loops should be simplified before this analysis. // //===----------------------------------------------------------------------===// #include "llvm/Analysis/BlockFrequencyInfo.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/None.h" #include "llvm/ADT/iterator.h" #include "llvm/Analysis/BlockFrequencyInfoImpl.h" #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Function.h" #include "llvm/IR/PassManager.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/GraphWriter.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <cassert> #include <string> using namespace llvm; #define DEBUG_TYPE "block-freq" static cl::opt<GVDAGType> ViewBlockFreqPropagationDAG( "view-block-freq-propagation-dags", cl::Hidden, cl::desc("Pop up a window to show a dag displaying how block " "frequencies propagation through the CFG."), cl::values(clEnumValN(GVDT_None, "none", "do not display graphs."), clEnumValN(GVDT_Fraction, "fraction", "display a graph using the " "fractional block frequency representation."), clEnumValN(GVDT_Integer, "integer", "display a graph using the raw " "integer fractional block frequency representation."), clEnumValN(GVDT_Count, "count", "display a graph using the real " "profile count if available."))); cl::opt<std::string> ViewBlockFreqFuncName("view-bfi-func-name", cl::Hidden, cl::desc("The option to specify " "the name of the function " "whose CFG will be displayed.")); cl::opt<unsigned> ViewHotFreqPercent("view-hot-freq-percent", cl::init(10), cl::Hidden, cl::desc("An integer in percent used to specify " "the hot blocks/edges to be displayed " "in red: a block or edge whose frequency " "is no less than the max frequency of the " "function multiplied by this percent.")); // Command line option to turn on CFG dot or text dump after profile annotation. cl::opt<PGOViewCountsType> PGOViewCounts( "pgo-view-counts", cl::Hidden, cl::desc("A boolean option to show CFG dag or text with " "block profile counts and branch probabilities " "right after PGO profile annotation step. The " "profile counts are computed using branch " "probabilities from the runtime profile data and " "block frequency propagation algorithm. To view " "the raw counts from the profile, use option " "-pgo-view-raw-counts instead. To limit graph " "display to only one function, use filtering option " "-view-bfi-func-name."), cl::values(clEnumValN(PGOVCT_None, "none", "do not show."), clEnumValN(PGOVCT_Graph, "graph", "show a graph."), clEnumValN(PGOVCT_Text, "text", "show in text."))); static cl::opt<bool> PrintBlockFreq( "print-bfi", cl::init(false), cl::Hidden, cl::desc("Print the block frequency info.")); cl::opt<std::string> PrintBlockFreqFuncName( "print-bfi-func-name", cl::Hidden, cl::desc("The option to specify the name of the function " "whose block frequency info is printed.")); namespace llvm { static GVDAGType getGVDT() { if (PGOViewCounts == PGOVCT_Graph) return GVDT_Count; return ViewBlockFreqPropagationDAG; } template <> struct GraphTraits<BlockFrequencyInfo *> { using NodeRef = const BasicBlock *; using ChildIteratorType = const_succ_iterator; using nodes_iterator = pointer_iterator<Function::const_iterator>; static NodeRef getEntryNode(const BlockFrequencyInfo *G) { return &G->getFunction()->front(); } static ChildIteratorType child_begin(const NodeRef N) { return succ_begin(N); } static ChildIteratorType child_end(const NodeRef N) { return succ_end(N); } static nodes_iterator nodes_begin(const BlockFrequencyInfo *G) { return nodes_iterator(G->getFunction()->begin()); } static nodes_iterator nodes_end(const BlockFrequencyInfo *G) { return nodes_iterator(G->getFunction()->end()); } }; using BFIDOTGTraitsBase = BFIDOTGraphTraitsBase<BlockFrequencyInfo, BranchProbabilityInfo>; template <> struct DOTGraphTraits<BlockFrequencyInfo *> : public BFIDOTGTraitsBase { explicit DOTGraphTraits(bool isSimple = false) : BFIDOTGTraitsBase(isSimple) {} std::string getNodeLabel(const BasicBlock *Node, const BlockFrequencyInfo *Graph) { return BFIDOTGTraitsBase::getNodeLabel(Node, Graph, getGVDT()); } std::string getNodeAttributes(const BasicBlock *Node, const BlockFrequencyInfo *Graph) { return BFIDOTGTraitsBase::getNodeAttributes(Node, Graph, ViewHotFreqPercent); } std::string getEdgeAttributes(const BasicBlock *Node, EdgeIter EI, const BlockFrequencyInfo *BFI) { return BFIDOTGTraitsBase::getEdgeAttributes(Node, EI, BFI, BFI->getBPI(), ViewHotFreqPercent); } }; } // end namespace llvm BlockFrequencyInfo::BlockFrequencyInfo() = default; BlockFrequencyInfo::BlockFrequencyInfo(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI) { calculate(F, BPI, LI); } BlockFrequencyInfo::BlockFrequencyInfo(BlockFrequencyInfo &&Arg) : BFI(std::move(Arg.BFI)) {} BlockFrequencyInfo &BlockFrequencyInfo::operator=(BlockFrequencyInfo &&RHS) { releaseMemory(); BFI = std::move(RHS.BFI); return *this; } // Explicitly define the default constructor otherwise it would be implicitly // defined at the first ODR-use which is the BFI member in the // LazyBlockFrequencyInfo header. The dtor needs the BlockFrequencyInfoImpl // template instantiated which is not available in the header. BlockFrequencyInfo::~BlockFrequencyInfo() = default; bool BlockFrequencyInfo::invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &) { // Check whether the analysis, all analyses on functions, or the function's // CFG have been preserved. auto PAC = PA.getChecker<BlockFrequencyAnalysis>(); return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() || PAC.preservedSet<CFGAnalyses>()); } void BlockFrequencyInfo::calculate(const Function &F, const BranchProbabilityInfo &BPI, const LoopInfo &LI) { if (!BFI) BFI.reset(new ImplType); BFI->calculate(F, BPI, LI); if (ViewBlockFreqPropagationDAG != GVDT_None && (ViewBlockFreqFuncName.empty() || F.getName().equals(ViewBlockFreqFuncName))) { view(); } if (PrintBlockFreq && (PrintBlockFreqFuncName.empty() || F.getName().equals(PrintBlockFreqFuncName))) { print(dbgs()); } } BlockFrequency BlockFrequencyInfo::getBlockFreq(const BasicBlock *BB) const { return BFI ? BFI->getBlockFreq(BB) : 0; } Optional<uint64_t> BlockFrequencyInfo::getBlockProfileCount(const BasicBlock *BB, bool AllowSynthetic) const { if (!BFI) return None; return BFI->getBlockProfileCount(*getFunction(), BB, AllowSynthetic); } Optional<uint64_t> BlockFrequencyInfo::getProfileCountFromFreq(uint64_t Freq) const { if (!BFI) return None; return BFI->getProfileCountFromFreq(*getFunction(), Freq); } bool BlockFrequencyInfo::isIrrLoopHeader(const BasicBlock *BB) { assert(BFI && "Expected analysis to be available"); return BFI->isIrrLoopHeader(BB); } void BlockFrequencyInfo::setBlockFreq(const BasicBlock *BB, uint64_t Freq) { assert(BFI && "Expected analysis to be available"); BFI->setBlockFreq(BB, Freq); } void BlockFrequencyInfo::setBlockFreqAndScale( const BasicBlock *ReferenceBB, uint64_t Freq, SmallPtrSetImpl<BasicBlock *> &BlocksToScale) { assert(BFI && "Expected analysis to be available"); // Use 128 bits APInt to avoid overflow. APInt NewFreq(128, Freq); APInt OldFreq(128, BFI->getBlockFreq(ReferenceBB).getFrequency()); APInt BBFreq(128, 0); for (auto *BB : BlocksToScale) { BBFreq = BFI->getBlockFreq(BB).getFrequency(); // Multiply first by NewFreq and then divide by OldFreq // to minimize loss of precision. BBFreq *= NewFreq; // udiv is an expensive operation in the general case. If this ends up being // a hot spot, one of the options proposed in // https://reviews.llvm.org/D28535#650071 could be used to avoid this. BBFreq = BBFreq.udiv(OldFreq); BFI->setBlockFreq(BB, BBFreq.getLimitedValue()); } BFI->setBlockFreq(ReferenceBB, Freq); } /// Pop up a ghostview window with the current block frequency propagation /// rendered using dot. void BlockFrequencyInfo::view(StringRef title) const { ViewGraph(const_cast<BlockFrequencyInfo *>(this), title); } const Function *BlockFrequencyInfo::getFunction() const { return BFI ? BFI->getFunction() : nullptr; } const BranchProbabilityInfo *BlockFrequencyInfo::getBPI() const { return BFI ? &BFI->getBPI() : nullptr; } raw_ostream &BlockFrequencyInfo:: printBlockFreq(raw_ostream &OS, const BlockFrequency Freq) const { return BFI ? BFI->printBlockFreq(OS, Freq) : OS; } raw_ostream & BlockFrequencyInfo::printBlockFreq(raw_ostream &OS, const BasicBlock *BB) const { return BFI ? BFI->printBlockFreq(OS, BB) : OS; } uint64_t BlockFrequencyInfo::getEntryFreq() const { return BFI ? BFI->getEntryFreq() : 0; } void BlockFrequencyInfo::releaseMemory() { BFI.reset(); } void BlockFrequencyInfo::print(raw_ostream &OS) const { if (BFI) BFI->print(OS); } void BlockFrequencyInfo::verifyMatch(BlockFrequencyInfo &Other) const { if (BFI) BFI->verifyMatch(*Other.BFI); } INITIALIZE_PASS_BEGIN(BlockFrequencyInfoWrapperPass, "block-freq", "Block Frequency Analysis", true, true) INITIALIZE_PASS_DEPENDENCY(BranchProbabilityInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) INITIALIZE_PASS_END(BlockFrequencyInfoWrapperPass, "block-freq", "Block Frequency Analysis", true, true) char BlockFrequencyInfoWrapperPass::ID = 0; BlockFrequencyInfoWrapperPass::BlockFrequencyInfoWrapperPass() : FunctionPass(ID) { initializeBlockFrequencyInfoWrapperPassPass(*PassRegistry::getPassRegistry()); } BlockFrequencyInfoWrapperPass::~BlockFrequencyInfoWrapperPass() = default; void BlockFrequencyInfoWrapperPass::print(raw_ostream &OS, const Module *) const { BFI.print(OS); } void BlockFrequencyInfoWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<BranchProbabilityInfoWrapperPass>(); AU.addRequired<LoopInfoWrapperPass>(); AU.setPreservesAll(); } void BlockFrequencyInfoWrapperPass::releaseMemory() { BFI.releaseMemory(); } bool BlockFrequencyInfoWrapperPass::runOnFunction(Function &F) { BranchProbabilityInfo &BPI = getAnalysis<BranchProbabilityInfoWrapperPass>().getBPI(); LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); BFI.calculate(F, BPI, LI); return false; } AnalysisKey BlockFrequencyAnalysis::Key; BlockFrequencyInfo BlockFrequencyAnalysis::run(Function &F, FunctionAnalysisManager &AM) { BlockFrequencyInfo BFI; BFI.calculate(F, AM.getResult<BranchProbabilityAnalysis>(F), AM.getResult<LoopAnalysis>(F)); return BFI; } PreservedAnalyses BlockFrequencyPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { OS << "Printing analysis results of BFI for function " << "'" << F.getName() << "':" << "\n"; AM.getResult<BlockFrequencyAnalysis>(F).print(OS); return PreservedAnalyses::all(); }
Upload File
Create Folder