
//==- MachineBranchProbabilityInfo.h - Machine Branch Probability Analysis -==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass is used to evaluate branch probabilties on machine basic blocks.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
#define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H

#include "llvm/Pass.h"
#include "llvm/Support/BranchProbability.h"
#include <climits>

namespace llvm {

class raw_ostream;
class MachineBasicBlock;

class MachineBranchProbabilityInfo : public ImmutablePass {

  // Default weight value. Used when we don't have information about the edge.
  // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
  // the successors have a weight yet. But it doesn't make sense when providing
  // weight to an edge that may have siblings with non-zero weights. This can
  // be handled various ways, but it's probably fine for an edge with unknown
  // weight to just "inherit" the non-zero weight of an adjacent successor.
  static const uint32_t DEFAULT_WEIGHT = 16;

  // Get sum of the block successors' weights.
  uint32_t getSumForBlock(MachineBasicBlock *MBB) const;

public:
  static char ID;

  MachineBranchProbabilityInfo() : ImmutablePass(ID) {
    PassRegistry &Registry = *PassRegistry::getPassRegistry();
    initializeMachineBranchProbabilityInfoPass(Registry);
  }

  void getAnalysisUsage(AnalysisUsage &AU) const {
    AU.setPreservesAll();
  }

  // Return edge weight. If we don't have any informations about it - return
  // DEFAULT_WEIGHT.
  uint32_t getEdgeWeight(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;

  // A 'Hot' edge is an edge which probability is >= 80%.
  bool isEdgeHot(MachineBasicBlock *Src, MachineBasicBlock *Dst) const;

  // Return a hot successor for the block BB or null if there isn't one.
  MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) const;

  // Return a probability as a fraction between 0 (0% probability) and
  // 1 (100% probability), however the value is never equal to 0, and can be 1
  // only iff SRC block has only one successor.
  BranchProbability getEdgeProbability(MachineBasicBlock *Src,
                                       MachineBasicBlock *Dst) const;

  // Print value between 0 (0% probability) and 1 (100% probability),
  // however the value is never equal to 0, and can be 1 only iff SRC block
  // has only one successor.
  raw_ostream &printEdgeProbability(raw_ostream &OS, MachineBasicBlock *Src,
                                    MachineBasicBlock *Dst) const;
};

}


#endif
