LCOV - code coverage report
Current view: top level - include/llvm/Analysis - LazyBranchProbabilityInfo.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 7 8 87.5 %
Date: 2018-10-20 13:21:21 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- LazyBranchProbabilityInfo.h - Lazy Branch Probability ----*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This is an alternative analysis pass to BranchProbabilityInfoWrapperPass.
      11             : // The difference is that with this pass the branch probabilities are not
      12             : // computed when the analysis pass is executed but rather when the BPI results
      13             : // is explicitly requested by the analysis client.
      14             : //
      15             : //===----------------------------------------------------------------------===//
      16             : 
      17             : #ifndef LLVM_ANALYSIS_LAZYBRANCHPROBABILITYINFO_H
      18             : #define LLVM_ANALYSIS_LAZYBRANCHPROBABILITYINFO_H
      19             : 
      20             : #include "llvm/Analysis/BranchProbabilityInfo.h"
      21             : #include "llvm/Pass.h"
      22             : 
      23             : namespace llvm {
      24             : class AnalysisUsage;
      25             : class Function;
      26             : class LoopInfo;
      27             : class TargetLibraryInfo;
      28             : 
      29             : /// This is an alternative analysis pass to
      30             : /// BranchProbabilityInfoWrapperPass.  The difference is that with this pass the
      31             : /// branch probabilities are not computed when the analysis pass is executed but
      32             : /// rather when the BPI results is explicitly requested by the analysis client.
      33             : ///
      34             : /// There are some additional requirements for any client pass that wants to use
      35             : /// the analysis:
      36             : ///
      37             : /// 1. The pass needs to initialize dependent passes with:
      38             : ///
      39             : ///   INITIALIZE_PASS_DEPENDENCY(LazyBPIPass)
      40             : ///
      41             : /// 2. Similarly, getAnalysisUsage should call:
      42             : ///
      43             : ///   LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AU)
      44             : ///
      45             : /// 3. The computed BPI should be requested with
      46             : ///    getAnalysis<LazyBranchProbabilityInfoPass>().getBPI() before LoopInfo
      47             : ///    could be invalidated for example by changing the CFG.
      48             : ///
      49             : /// Note that it is expected that we wouldn't need this functionality for the
      50             : /// new PM since with the new PM, analyses are executed on demand.
      51             : class LazyBranchProbabilityInfoPass : public FunctionPass {
      52             : 
      53             :   /// Wraps a BPI to allow lazy computation of the branch probabilities.
      54             :   ///
      55             :   /// A pass that only conditionally uses BPI can uncondtionally require the
      56             :   /// analysis without paying for the overhead if BPI doesn't end up being used.
      57      468603 :   class LazyBranchProbabilityInfo {
      58             :   public:
      59             :     LazyBranchProbabilityInfo(const Function *F, const LoopInfo *LI,
      60             :                               const TargetLibraryInfo *TLI)
      61           0 :         : Calculated(false), F(F), LI(LI), TLI(TLI) {}
      62             : 
      63             :     /// Retrieve the BPI with the branch probabilities computed.
      64             :     BranchProbabilityInfo &getCalculated() {
      65         241 :       if (!Calculated) {
      66             :         assert(F && LI && "call setAnalysis");
      67         241 :         BPI.calculate(*F, *LI, TLI);
      68         241 :         Calculated = true;
      69             :       }
      70         241 :       return BPI;
      71             :     }
      72             : 
      73             :     const BranchProbabilityInfo &getCalculated() const {
      74             :       return const_cast<LazyBranchProbabilityInfo *>(this)->getCalculated();
      75             :     }
      76             : 
      77             :   private:
      78             :     BranchProbabilityInfo BPI;
      79             :     bool Calculated;
      80             :     const Function *F;
      81             :     const LoopInfo *LI;
      82             :     const TargetLibraryInfo *TLI;
      83             :   };
      84             : 
      85             :   std::unique_ptr<LazyBranchProbabilityInfo> LBPI;
      86             : 
      87             : public:
      88             :   static char ID;
      89             : 
      90             :   LazyBranchProbabilityInfoPass();
      91             : 
      92             :   /// Compute and return the branch probabilities.
      93         209 :   BranchProbabilityInfo &getBPI() { return LBPI->getCalculated(); }
      94             : 
      95             :   /// Compute and return the branch probabilities.
      96             :   const BranchProbabilityInfo &getBPI() const { return LBPI->getCalculated(); }
      97             : 
      98             :   void getAnalysisUsage(AnalysisUsage &AU) const override;
      99             : 
     100             :   /// Helper for client passes to set up the analysis usage on behalf of this
     101             :   /// pass.
     102             :   static void getLazyBPIAnalysisUsage(AnalysisUsage &AU);
     103             : 
     104             :   bool runOnFunction(Function &F) override;
     105             :   void releaseMemory() override;
     106             :   void print(raw_ostream &OS, const Module *M) const override;
     107             : };
     108             : 
     109             : /// Helper for client passes to initialize dependent passes for LBPI.
     110             : void initializeLazyBPIPassPass(PassRegistry &Registry);
     111             : 
     112             : /// Simple trait class that provides a mapping between BPI passes and the
     113             : /// corresponding BPInfo.
     114             : template <typename PassT> struct BPIPassTrait {
     115             :   static PassT &getBPI(PassT *P) { return *P; }
     116             : };
     117             : 
     118             : template <> struct BPIPassTrait<LazyBranchProbabilityInfoPass> {
     119             :   static BranchProbabilityInfo &getBPI(LazyBranchProbabilityInfoPass *P) {
     120         209 :     return P->getBPI();
     121             :   }
     122             : };
     123             : }
     124             : #endif

Generated by: LCOV version 1.13