mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
(This is the second attempt to submit this patch. The first caused two assertion failures and was reverted. See https://llvm.org/bugs/show_bug.cgi?id=25687) The patch in http://reviews.llvm.org/D13745 is broken into four parts: 1. New interfaces without functional changes (http://reviews.llvm.org/D13908). 2. Use new interfaces in SelectionDAG, while in other passes treat probabilities as weights (http://reviews.llvm.org/D14361). 3. Use new interfaces in all other passes. 4. Remove old interfaces. This patch is 3+4 above. In this patch, MBB won't provide weight-based interfaces any more, which are totally replaced by probability-based ones. The interface addSuccessor() is redesigned so that the default probability is unknown. We allow unknown probabilities but don't allow using it together with known probabilities in successor list. That is to say, we either have a list of successors with all known probabilities, or all unknown probabilities. In the latter case, we assume each successor has 1/N probability where N is the number of successors. An assertion checks if the user is attempting to add a successor with the disallowed mixed use as stated above. This can help us catch many misuses. All uses of weight-based interfaces are now updated to use probability-based ones. Differential revision: http://reviews.llvm.org/D14973 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254377 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
3.3 KiB
C++
88 lines
3.3 KiB
C++
//=- MachineBranchProbabilityInfo.h - Branch Probability Analysis -*- C++ -*-=//
|
|
//
|
|
// 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/CodeGen/MachineBasicBlock.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Support/BranchProbability.h"
|
|
#include <climits>
|
|
#include <numeric>
|
|
|
|
namespace llvm {
|
|
|
|
class MachineBranchProbabilityInfo : public ImmutablePass {
|
|
virtual void anchor();
|
|
|
|
// 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;
|
|
|
|
public:
|
|
static char ID;
|
|
|
|
MachineBranchProbabilityInfo() : ImmutablePass(ID) {
|
|
PassRegistry &Registry = *PassRegistry::getPassRegistry();
|
|
initializeMachineBranchProbabilityInfoPass(Registry);
|
|
}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesAll();
|
|
}
|
|
|
|
// Return edge weight. If we don't have any informations about it - return
|
|
// DEFAULT_WEIGHT.
|
|
uint32_t getEdgeWeight(const MachineBasicBlock *Src,
|
|
const MachineBasicBlock *Dst) const;
|
|
|
|
// Same thing, but using a const_succ_iterator from Src. This is faster when
|
|
// the iterator is already available.
|
|
uint32_t getEdgeWeight(const MachineBasicBlock *Src,
|
|
MachineBasicBlock::const_succ_iterator Dst) const;
|
|
|
|
// Return edge probability.
|
|
BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
|
|
const MachineBasicBlock *Dst) const;
|
|
|
|
// Same as above, but using a const_succ_iterator from Src. This is faster
|
|
// when the iterator is already available.
|
|
BranchProbability
|
|
getEdgeProbability(const MachineBasicBlock *Src,
|
|
MachineBasicBlock::const_succ_iterator Dst) const;
|
|
|
|
// A 'Hot' edge is an edge which probability is >= 80%.
|
|
bool isEdgeHot(const MachineBasicBlock *Src,
|
|
const MachineBasicBlock *Dst) const;
|
|
|
|
// Return a hot successor for the block BB or null if there isn't one.
|
|
// NB: This routine's complexity is linear on the number of successors.
|
|
MachineBasicBlock *getHotSucc(MachineBasicBlock *MBB) 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,
|
|
const MachineBasicBlock *Src,
|
|
const MachineBasicBlock *Dst) const;
|
|
};
|
|
|
|
}
|
|
|
|
|
|
#endif
|