Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //=- MachineBranchProbabilityInfo.h - Branch Probability Analysis -*- C++ -*-=//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This pass is used to evaluate branch probabilties on machine basic blocks.
  10. //
  11. //===----------------------------------------------------------------------===//
  12.  
  13. #ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
  14. #define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
  15.  
  16. #include "llvm/CodeGen/MachineBasicBlock.h"
  17. #include "llvm/Pass.h"
  18. #include "llvm/Support/BranchProbability.h"
  19.  
  20. namespace llvm {
  21.  
  22. class MachineBranchProbabilityInfo : public ImmutablePass {
  23.   virtual void anchor();
  24.  
  25.   // Default weight value. Used when we don't have information about the edge.
  26.   // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
  27.   // the successors have a weight yet. But it doesn't make sense when providing
  28.   // weight to an edge that may have siblings with non-zero weights. This can
  29.   // be handled various ways, but it's probably fine for an edge with unknown
  30.   // weight to just "inherit" the non-zero weight of an adjacent successor.
  31.   static const uint32_t DEFAULT_WEIGHT = 16;
  32.  
  33. public:
  34.   static char ID;
  35.  
  36.   MachineBranchProbabilityInfo();
  37.  
  38.   void getAnalysisUsage(AnalysisUsage &AU) const override {
  39.     AU.setPreservesAll();
  40.   }
  41.  
  42.   // Return edge probability.
  43.   BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
  44.                                        const MachineBasicBlock *Dst) const;
  45.  
  46.   // Same as above, but using a const_succ_iterator from Src. This is faster
  47.   // when the iterator is already available.
  48.   BranchProbability
  49.   getEdgeProbability(const MachineBasicBlock *Src,
  50.                      MachineBasicBlock::const_succ_iterator Dst) const;
  51.  
  52.   // A 'Hot' edge is an edge which probability is >= 80%.
  53.   bool isEdgeHot(const MachineBasicBlock *Src,
  54.                  const MachineBasicBlock *Dst) const;
  55.  
  56.   // Print value between 0 (0% probability) and 1 (100% probability),
  57.   // however the value is never equal to 0, and can be 1 only iff SRC block
  58.   // has only one successor.
  59.   raw_ostream &printEdgeProbability(raw_ostream &OS,
  60.                                     const MachineBasicBlock *Src,
  61.                                     const MachineBasicBlock *Dst) const;
  62. };
  63.  
  64. }
  65.  
  66.  
  67. #endif
  68.