2012-08-15 12:22:35 +00:00
|
|
|
//===-- BranchProbabilityInfo.cpp - Branch Probability Analysis -----------===//
|
2011-06-04 01:16:30 +00:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Loops should be simplified before this analysis.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2012-12-03 16:50:05 +00:00
|
|
|
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
|
|
|
#include "llvm/ADT/PostOrderIterator.h"
|
|
|
|
#include "llvm/Analysis/LoopInfo.h"
|
2014-03-04 11:45:46 +00:00
|
|
|
#include "llvm/IR/CFG.h"
|
2013-01-02 11:36:10 +00:00
|
|
|
#include "llvm/IR/Constants.h"
|
|
|
|
#include "llvm/IR/Function.h"
|
|
|
|
#include "llvm/IR/Instructions.h"
|
|
|
|
#include "llvm/IR/LLVMContext.h"
|
|
|
|
#include "llvm/IR/Metadata.h"
|
2011-06-11 01:05:22 +00:00
|
|
|
#include "llvm/Support/Debug.h"
|
2015-03-23 18:07:13 +00:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2011-06-04 01:16:30 +00:00
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
|
2014-04-22 02:48:03 +00:00
|
|
|
#define DEBUG_TYPE "branch-prob"
|
|
|
|
|
2015-07-15 22:48:29 +00:00
|
|
|
INITIALIZE_PASS_BEGIN(BranchProbabilityInfoWrapperPass, "branch-prob",
|
2011-06-04 01:16:30 +00:00
|
|
|
"Branch Probability Analysis", false, true)
|
2015-01-17 14:16:18 +00:00
|
|
|
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
|
2015-07-15 22:48:29 +00:00
|
|
|
INITIALIZE_PASS_END(BranchProbabilityInfoWrapperPass, "branch-prob",
|
2011-06-04 01:16:30 +00:00
|
|
|
"Branch Probability Analysis", false, true)
|
|
|
|
|
2015-07-15 22:48:29 +00:00
|
|
|
char BranchProbabilityInfoWrapperPass::ID = 0;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-10-24 01:40:45 +00:00
|
|
|
// Weights are for internal use only. They are used by heuristics to help to
|
|
|
|
// estimate edges' probability. Example:
|
|
|
|
//
|
|
|
|
// Using "Loop Branch Heuristics" we predict weights of edges for the
|
|
|
|
// block BB2.
|
|
|
|
// ...
|
|
|
|
// |
|
|
|
|
// V
|
|
|
|
// BB1<-+
|
|
|
|
// | |
|
|
|
|
// | | (Weight = 124)
|
|
|
|
// V |
|
|
|
|
// BB2--+
|
|
|
|
// |
|
|
|
|
// | (Weight = 4)
|
|
|
|
// V
|
|
|
|
// BB3
|
|
|
|
//
|
|
|
|
// Probability of the edge BB2->BB1 = 124 / (124 + 4) = 0.96875
|
|
|
|
// Probability of the edge BB2->BB3 = 4 / (124 + 4) = 0.03125
|
|
|
|
static const uint32_t LBH_TAKEN_WEIGHT = 124;
|
|
|
|
static const uint32_t LBH_NONTAKEN_WEIGHT = 4;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-10-24 12:01:08 +00:00
|
|
|
/// \brief Unreachable-terminating branch taken weight.
|
|
|
|
///
|
|
|
|
/// This is the weight for a branch being taken to a block that terminates
|
|
|
|
/// (eventually) in unreachable. These are predicted as unlikely as possible.
|
|
|
|
static const uint32_t UR_TAKEN_WEIGHT = 1;
|
|
|
|
|
|
|
|
/// \brief Unreachable-terminating branch not-taken weight.
|
|
|
|
///
|
|
|
|
/// This is the weight for a branch not being taken toward a block that
|
|
|
|
/// terminates (eventually) in unreachable. Such a branch is essentially never
|
2011-12-22 09:26:37 +00:00
|
|
|
/// taken. Set the weight to an absurdly high value so that nested loops don't
|
|
|
|
/// easily subsume it.
|
|
|
|
static const uint32_t UR_NONTAKEN_WEIGHT = 1024*1024 - 1;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2013-05-24 12:26:52 +00:00
|
|
|
/// \brief Weight for a branch taken going into a cold block.
|
|
|
|
///
|
|
|
|
/// This is the weight for a branch taken toward a block marked
|
|
|
|
/// cold. A block is marked cold if it's postdominated by a
|
|
|
|
/// block containing a call to a cold function. Cold functions
|
|
|
|
/// are those marked with attribute 'cold'.
|
|
|
|
static const uint32_t CC_TAKEN_WEIGHT = 4;
|
|
|
|
|
|
|
|
/// \brief Weight for a branch not-taken into a cold block.
|
|
|
|
///
|
|
|
|
/// This is the weight for a branch not taken toward a block marked
|
|
|
|
/// cold.
|
|
|
|
static const uint32_t CC_NONTAKEN_WEIGHT = 64;
|
|
|
|
|
2011-10-24 01:40:45 +00:00
|
|
|
static const uint32_t PH_TAKEN_WEIGHT = 20;
|
|
|
|
static const uint32_t PH_NONTAKEN_WEIGHT = 12;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-10-24 01:40:45 +00:00
|
|
|
static const uint32_t ZH_TAKEN_WEIGHT = 20;
|
|
|
|
static const uint32_t ZH_NONTAKEN_WEIGHT = 12;
|
|
|
|
|
|
|
|
static const uint32_t FPH_TAKEN_WEIGHT = 20;
|
|
|
|
static const uint32_t FPH_NONTAKEN_WEIGHT = 12;
|
|
|
|
|
2012-08-15 12:22:35 +00:00
|
|
|
/// \brief Invoke-terminating normal branch taken weight
|
|
|
|
///
|
|
|
|
/// This is the weight for branching to the normal destination of an invoke
|
|
|
|
/// instruction. We expect this to happen most of the time. Set the weight to an
|
|
|
|
/// absurdly high value so that nested loops subsume it.
|
|
|
|
static const uint32_t IH_TAKEN_WEIGHT = 1024 * 1024 - 1;
|
|
|
|
|
|
|
|
/// \brief Invoke-terminating normal branch not-taken weight.
|
|
|
|
///
|
|
|
|
/// This is the weight for branching to the unwind destination of an invoke
|
|
|
|
/// instruction. This is essentially never taken.
|
|
|
|
static const uint32_t IH_NONTAKEN_WEIGHT = 1;
|
|
|
|
|
2011-10-24 12:01:08 +00:00
|
|
|
/// \brief Calculate edge weights for successors lead to unreachable.
|
|
|
|
///
|
|
|
|
/// Predict that a successor which leads necessarily to an
|
|
|
|
/// unreachable-terminated block as extremely unlikely.
|
|
|
|
bool BranchProbabilityInfo::calcUnreachableHeuristics(BasicBlock *BB) {
|
|
|
|
TerminatorInst *TI = BB->getTerminator();
|
|
|
|
if (TI->getNumSuccessors() == 0) {
|
|
|
|
if (isa<UnreachableInst>(TI))
|
|
|
|
PostDominatedByUnreachable.insert(BB);
|
|
|
|
return false;
|
|
|
|
}
|
2011-10-24 01:40:45 +00:00
|
|
|
|
2012-08-24 18:14:27 +00:00
|
|
|
SmallVector<unsigned, 4> UnreachableEdges;
|
|
|
|
SmallVector<unsigned, 4> ReachableEdges;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-10-24 12:01:08 +00:00
|
|
|
for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
|
|
|
|
if (PostDominatedByUnreachable.count(*I))
|
2012-08-24 18:14:27 +00:00
|
|
|
UnreachableEdges.push_back(I.getSuccessorIndex());
|
2011-10-24 12:01:08 +00:00
|
|
|
else
|
2012-08-24 18:14:27 +00:00
|
|
|
ReachableEdges.push_back(I.getSuccessorIndex());
|
2011-10-24 01:40:45 +00:00
|
|
|
}
|
2011-07-31 03:27:24 +00:00
|
|
|
|
2011-10-24 12:01:08 +00:00
|
|
|
// If all successors are in the set of blocks post-dominated by unreachable,
|
|
|
|
// this block is too.
|
|
|
|
if (UnreachableEdges.size() == TI->getNumSuccessors())
|
|
|
|
PostDominatedByUnreachable.insert(BB);
|
2011-10-24 01:40:45 +00:00
|
|
|
|
2011-10-24 12:01:08 +00:00
|
|
|
// Skip probabilities if this block has a single successor or if all were
|
|
|
|
// reachable.
|
|
|
|
if (TI->getNumSuccessors() == 1 || UnreachableEdges.empty())
|
|
|
|
return false;
|
2011-10-21 20:12:47 +00:00
|
|
|
|
2015-12-21 22:00:51 +00:00
|
|
|
// If the terminator is an InvokeInst, check only the normal destination block
|
|
|
|
// as the unwind edge of InvokeInst is also very unlikely taken.
|
|
|
|
if (auto *II = dyn_cast<InvokeInst>(TI))
|
|
|
|
if (PostDominatedByUnreachable.count(II->getNormalDest())) {
|
|
|
|
PostDominatedByUnreachable.insert(BB);
|
|
|
|
// Return false here so that edge weights for InvokeInst could be decided
|
|
|
|
// in calcInvokeHeuristics().
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
if (ReachableEdges.empty()) {
|
|
|
|
BranchProbability Prob(1, UnreachableEdges.size());
|
|
|
|
for (unsigned SuccIdx : UnreachableEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, Prob);
|
2011-10-24 12:01:08 +00:00
|
|
|
return true;
|
2015-12-22 18:56:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BranchProbability UnreachableProb(UR_TAKEN_WEIGHT,
|
|
|
|
(UR_TAKEN_WEIGHT + UR_NONTAKEN_WEIGHT) *
|
|
|
|
UnreachableEdges.size());
|
|
|
|
BranchProbability ReachableProb(UR_NONTAKEN_WEIGHT,
|
|
|
|
(UR_TAKEN_WEIGHT + UR_NONTAKEN_WEIGHT) *
|
|
|
|
ReachableEdges.size());
|
|
|
|
|
|
|
|
for (unsigned SuccIdx : UnreachableEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, UnreachableProb);
|
|
|
|
for (unsigned SuccIdx : ReachableEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, ReachableProb);
|
2011-10-24 12:01:08 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-10-19 10:30:30 +00:00
|
|
|
// Propagate existing explicit probabilities from either profile data or
|
|
|
|
// 'expect' intrinsic processing.
|
2011-10-24 01:40:45 +00:00
|
|
|
bool BranchProbabilityInfo::calcMetadataWeights(BasicBlock *BB) {
|
2011-10-19 10:32:19 +00:00
|
|
|
TerminatorInst *TI = BB->getTerminator();
|
|
|
|
if (TI->getNumSuccessors() == 1)
|
|
|
|
return false;
|
|
|
|
if (!isa<BranchInst>(TI) && !isa<SwitchInst>(TI))
|
2011-10-19 10:30:30 +00:00
|
|
|
return false;
|
|
|
|
|
2014-11-11 21:30:22 +00:00
|
|
|
MDNode *WeightsNode = TI->getMetadata(LLVMContext::MD_prof);
|
2011-10-19 10:32:19 +00:00
|
|
|
if (!WeightsNode)
|
2011-10-19 10:30:30 +00:00
|
|
|
return false;
|
|
|
|
|
2015-05-07 17:22:06 +00:00
|
|
|
// Check that the number of successors is manageable.
|
|
|
|
assert(TI->getNumSuccessors() < UINT32_MAX && "Too many successors");
|
|
|
|
|
2011-10-19 10:32:19 +00:00
|
|
|
// Ensure there are weights for all of the successors. Note that the first
|
|
|
|
// operand to the metadata node is a name, not a weight.
|
|
|
|
if (WeightsNode->getNumOperands() != TI->getNumSuccessors() + 1)
|
2011-10-19 10:30:30 +00:00
|
|
|
return false;
|
|
|
|
|
2015-05-07 17:22:06 +00:00
|
|
|
// Build up the final weights that will be used in a temporary buffer.
|
|
|
|
// Compute the sum of all weights to later decide whether they need to
|
|
|
|
// be scaled to fit in 32 bits.
|
|
|
|
uint64_t WeightSum = 0;
|
2011-10-19 10:32:19 +00:00
|
|
|
SmallVector<uint32_t, 2> Weights;
|
|
|
|
Weights.reserve(TI->getNumSuccessors());
|
|
|
|
for (unsigned i = 1, e = WeightsNode->getNumOperands(); i != e; ++i) {
|
IR: Split Metadata from Value
Split `Metadata` away from the `Value` class hierarchy, as part of
PR21532. Assembly and bitcode changes are in the wings, but this is the
bulk of the change for the IR C++ API.
I have a follow-up patch prepared for `clang`. If this breaks other
sub-projects, I apologize in advance :(. Help me compile it on Darwin
I'll try to fix it. FWIW, the errors should be easy to fix, so it may
be simpler to just fix it yourself.
This breaks the build for all metadata-related code that's out-of-tree.
Rest assured the transition is mechanical and the compiler should catch
almost all of the problems.
Here's a quick guide for updating your code:
- `Metadata` is the root of a class hierarchy with three main classes:
`MDNode`, `MDString`, and `ValueAsMetadata`. It is distinct from
the `Value` class hierarchy. It is typeless -- i.e., instances do
*not* have a `Type`.
- `MDNode`'s operands are all `Metadata *` (instead of `Value *`).
- `TrackingVH<MDNode>` and `WeakVH` referring to metadata can be
replaced with `TrackingMDNodeRef` and `TrackingMDRef`, respectively.
If you're referring solely to resolved `MDNode`s -- post graph
construction -- just use `MDNode*`.
- `MDNode` (and the rest of `Metadata`) have only limited support for
`replaceAllUsesWith()`.
As long as an `MDNode` is pointing at a forward declaration -- the
result of `MDNode::getTemporary()` -- it maintains a side map of its
uses and can RAUW itself. Once the forward declarations are fully
resolved RAUW support is dropped on the ground. This means that
uniquing collisions on changing operands cause nodes to become
"distinct". (This already happened fairly commonly, whenever an
operand went to null.)
If you're constructing complex (non self-reference) `MDNode` cycles,
you need to call `MDNode::resolveCycles()` on each node (or on a
top-level node that somehow references all of the nodes). Also,
don't do that. Metadata cycles (and the RAUW machinery needed to
construct them) are expensive.
- An `MDNode` can only refer to a `Constant` through a bridge called
`ConstantAsMetadata` (one of the subclasses of `ValueAsMetadata`).
As a side effect, accessing an operand of an `MDNode` that is known
to be, e.g., `ConstantInt`, takes three steps: first, cast from
`Metadata` to `ConstantAsMetadata`; second, extract the `Constant`;
third, cast down to `ConstantInt`.
The eventual goal is to introduce `MDInt`/`MDFloat`/etc. and have
metadata schema owners transition away from using `Constant`s when
the type isn't important (and they don't care about referring to
`GlobalValue`s).
In the meantime, I've added transitional API to the `mdconst`
namespace that matches semantics with the old code, in order to
avoid adding the error-prone three-step equivalent to every call
site. If your old code was:
MDNode *N = foo();
bar(isa <ConstantInt>(N->getOperand(0)));
baz(cast <ConstantInt>(N->getOperand(1)));
bak(cast_or_null <ConstantInt>(N->getOperand(2)));
bat(dyn_cast <ConstantInt>(N->getOperand(3)));
bay(dyn_cast_or_null<ConstantInt>(N->getOperand(4)));
you can trivially match its semantics with:
MDNode *N = foo();
bar(mdconst::hasa <ConstantInt>(N->getOperand(0)));
baz(mdconst::extract <ConstantInt>(N->getOperand(1)));
bak(mdconst::extract_or_null <ConstantInt>(N->getOperand(2)));
bat(mdconst::dyn_extract <ConstantInt>(N->getOperand(3)));
bay(mdconst::dyn_extract_or_null<ConstantInt>(N->getOperand(4)));
and when you transition your metadata schema to `MDInt`:
MDNode *N = foo();
bar(isa <MDInt>(N->getOperand(0)));
baz(cast <MDInt>(N->getOperand(1)));
bak(cast_or_null <MDInt>(N->getOperand(2)));
bat(dyn_cast <MDInt>(N->getOperand(3)));
bay(dyn_cast_or_null<MDInt>(N->getOperand(4)));
- A `CallInst` -- specifically, intrinsic instructions -- can refer to
metadata through a bridge called `MetadataAsValue`. This is a
subclass of `Value` where `getType()->isMetadataTy()`.
`MetadataAsValue` is the *only* class that can legally refer to a
`LocalAsMetadata`, which is a bridged form of non-`Constant` values
like `Argument` and `Instruction`. It can also refer to any other
`Metadata` subclass.
(I'll break all your testcases in a follow-up commit, when I propagate
this change to assembly.)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223802 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-09 18:38:53 +00:00
|
|
|
ConstantInt *Weight =
|
|
|
|
mdconst::dyn_extract<ConstantInt>(WeightsNode->getOperand(i));
|
2011-10-19 10:32:19 +00:00
|
|
|
if (!Weight)
|
|
|
|
return false;
|
2015-05-07 17:22:06 +00:00
|
|
|
assert(Weight->getValue().getActiveBits() <= 32 &&
|
|
|
|
"Too many bits for uint32_t");
|
|
|
|
Weights.push_back(Weight->getZExtValue());
|
|
|
|
WeightSum += Weights.back();
|
2011-10-19 10:32:19 +00:00
|
|
|
}
|
|
|
|
assert(Weights.size() == TI->getNumSuccessors() && "Checked above");
|
2015-05-07 17:22:06 +00:00
|
|
|
|
|
|
|
// If the sum of weights does not fit in 32 bits, scale every weight down
|
|
|
|
// accordingly.
|
|
|
|
uint64_t ScalingFactor =
|
|
|
|
(WeightSum > UINT32_MAX) ? WeightSum / UINT32_MAX + 1 : 1;
|
|
|
|
|
|
|
|
WeightSum = 0;
|
|
|
|
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) {
|
2015-12-22 18:56:14 +00:00
|
|
|
Weights[i] /= ScalingFactor;
|
|
|
|
WeightSum += Weights[i];
|
2015-05-07 17:22:06 +00:00
|
|
|
}
|
2015-12-22 23:45:55 +00:00
|
|
|
|
|
|
|
if (WeightSum == 0) {
|
|
|
|
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
|
|
|
|
setEdgeProbability(BB, i, {1, e});
|
|
|
|
} else {
|
|
|
|
for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)
|
|
|
|
setEdgeProbability(BB, i, {Weights[i], static_cast<uint32_t>(WeightSum)});
|
|
|
|
}
|
2015-12-22 18:56:14 +00:00
|
|
|
|
2015-05-07 17:22:06 +00:00
|
|
|
assert(WeightSum <= UINT32_MAX &&
|
|
|
|
"Expected weights to scale down to 32 bits");
|
2011-10-19 10:30:30 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-05-24 12:26:52 +00:00
|
|
|
/// \brief Calculate edge weights for edges leading to cold blocks.
|
|
|
|
///
|
|
|
|
/// A cold block is one post-dominated by a block with a call to a
|
|
|
|
/// cold function. Those edges are unlikely to be taken, so we give
|
|
|
|
/// them relatively low weight.
|
|
|
|
///
|
|
|
|
/// Return true if we could compute the weights for cold edges.
|
|
|
|
/// Return false, otherwise.
|
|
|
|
bool BranchProbabilityInfo::calcColdCallHeuristics(BasicBlock *BB) {
|
|
|
|
TerminatorInst *TI = BB->getTerminator();
|
|
|
|
if (TI->getNumSuccessors() == 0)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Determine which successors are post-dominated by a cold block.
|
|
|
|
SmallVector<unsigned, 4> ColdEdges;
|
|
|
|
SmallVector<unsigned, 4> NormalEdges;
|
|
|
|
for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
|
|
|
|
if (PostDominatedByColdCall.count(*I))
|
|
|
|
ColdEdges.push_back(I.getSuccessorIndex());
|
|
|
|
else
|
|
|
|
NormalEdges.push_back(I.getSuccessorIndex());
|
|
|
|
|
|
|
|
// If all successors are in the set of blocks post-dominated by cold calls,
|
|
|
|
// this block is in the set post-dominated by cold calls.
|
|
|
|
if (ColdEdges.size() == TI->getNumSuccessors())
|
|
|
|
PostDominatedByColdCall.insert(BB);
|
|
|
|
else {
|
|
|
|
// Otherwise, if the block itself contains a cold function, add it to the
|
|
|
|
// set of blocks postdominated by a cold call.
|
|
|
|
assert(!PostDominatedByColdCall.count(BB));
|
|
|
|
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I)
|
|
|
|
if (CallInst *CI = dyn_cast<CallInst>(I))
|
|
|
|
if (CI->hasFnAttr(Attribute::Cold)) {
|
|
|
|
PostDominatedByColdCall.insert(BB);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Skip probabilities if this block has a single successor.
|
|
|
|
if (TI->getNumSuccessors() == 1 || ColdEdges.empty())
|
|
|
|
return false;
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
if (NormalEdges.empty()) {
|
|
|
|
BranchProbability Prob(1, ColdEdges.size());
|
|
|
|
for (unsigned SuccIdx : ColdEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, Prob);
|
2013-05-24 12:26:52 +00:00
|
|
|
return true;
|
2015-12-22 18:56:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BranchProbability ColdProb(CC_TAKEN_WEIGHT,
|
|
|
|
(CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) *
|
|
|
|
ColdEdges.size());
|
|
|
|
BranchProbability NormalProb(CC_NONTAKEN_WEIGHT,
|
|
|
|
(CC_TAKEN_WEIGHT + CC_NONTAKEN_WEIGHT) *
|
|
|
|
NormalEdges.size());
|
|
|
|
|
|
|
|
for (unsigned SuccIdx : ColdEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, ColdProb);
|
|
|
|
for (unsigned SuccIdx : NormalEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, NormalProb);
|
2013-05-24 12:26:52 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-06-04 01:16:30 +00:00
|
|
|
// Calculate Edge Weights using "Pointer Heuristics". Predict a comparsion
|
|
|
|
// between two pointer or pointer and NULL will fail.
|
2011-10-24 01:40:45 +00:00
|
|
|
bool BranchProbabilityInfo::calcPointerHeuristics(BasicBlock *BB) {
|
2011-06-04 01:16:30 +00:00
|
|
|
BranchInst * BI = dyn_cast<BranchInst>(BB->getTerminator());
|
|
|
|
if (!BI || !BI->isConditional())
|
2011-07-28 21:45:07 +00:00
|
|
|
return false;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
|
|
|
Value *Cond = BI->getCondition();
|
|
|
|
ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
|
2011-07-15 20:51:06 +00:00
|
|
|
if (!CI || !CI->isEquality())
|
2011-07-28 21:45:07 +00:00
|
|
|
return false;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
|
|
|
Value *LHS = CI->getOperand(0);
|
|
|
|
|
|
|
|
if (!LHS->getType()->isPointerTy())
|
2011-07-28 21:45:07 +00:00
|
|
|
return false;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-06-04 02:07:10 +00:00
|
|
|
assert(CI->getOperand(1)->getType()->isPointerTy());
|
2011-06-04 01:16:30 +00:00
|
|
|
|
|
|
|
// p != 0 -> isProb = true
|
|
|
|
// p == 0 -> isProb = false
|
|
|
|
// p != q -> isProb = true
|
|
|
|
// p == q -> isProb = false;
|
2012-08-24 18:14:27 +00:00
|
|
|
unsigned TakenIdx = 0, NonTakenIdx = 1;
|
2011-07-15 20:51:06 +00:00
|
|
|
bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;
|
2011-06-04 01:16:30 +00:00
|
|
|
if (!isProb)
|
2012-08-24 18:14:27 +00:00
|
|
|
std::swap(TakenIdx, NonTakenIdx);
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
BranchProbability TakenProb(PH_TAKEN_WEIGHT,
|
|
|
|
PH_TAKEN_WEIGHT + PH_NONTAKEN_WEIGHT);
|
|
|
|
setEdgeProbability(BB, TakenIdx, TakenProb);
|
|
|
|
setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
|
2011-07-28 21:45:07 +00:00
|
|
|
return true;
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Calculate Edge Weights using "Loop Branch Heuristics". Predict backedges
|
|
|
|
// as taken, exiting edges as not-taken.
|
2015-07-15 22:48:29 +00:00
|
|
|
bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB,
|
|
|
|
const LoopInfo &LI) {
|
|
|
|
Loop *L = LI.getLoopFor(BB);
|
2011-06-04 01:16:30 +00:00
|
|
|
if (!L)
|
2011-07-28 21:45:07 +00:00
|
|
|
return false;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2012-08-24 18:14:27 +00:00
|
|
|
SmallVector<unsigned, 8> BackEdges;
|
|
|
|
SmallVector<unsigned, 8> ExitingEdges;
|
|
|
|
SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.
|
2011-07-28 21:33:46 +00:00
|
|
|
|
2011-06-04 01:16:30 +00:00
|
|
|
for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
|
2011-10-25 09:47:41 +00:00
|
|
|
if (!L->contains(*I))
|
2012-08-24 18:14:27 +00:00
|
|
|
ExitingEdges.push_back(I.getSuccessorIndex());
|
2011-10-25 09:47:41 +00:00
|
|
|
else if (L->getHeader() == *I)
|
2012-08-24 18:14:27 +00:00
|
|
|
BackEdges.push_back(I.getSuccessorIndex());
|
2011-10-25 09:47:41 +00:00
|
|
|
else
|
2012-08-24 18:14:27 +00:00
|
|
|
InEdges.push_back(I.getSuccessorIndex());
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
2014-04-14 16:56:19 +00:00
|
|
|
if (BackEdges.empty() && ExitingEdges.empty())
|
|
|
|
return false;
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
// Collect the sum of probabilities of back-edges/in-edges/exiting-edges, and
|
|
|
|
// normalize them so that they sum up to one.
|
|
|
|
SmallVector<BranchProbability, 4> Probs(3, BranchProbability::getZero());
|
|
|
|
unsigned Denom = (BackEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
|
|
|
|
(InEdges.empty() ? 0 : LBH_TAKEN_WEIGHT) +
|
|
|
|
(ExitingEdges.empty() ? 0 : LBH_NONTAKEN_WEIGHT);
|
|
|
|
if (!BackEdges.empty())
|
|
|
|
Probs[0] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
|
|
|
|
if (!InEdges.empty())
|
|
|
|
Probs[1] = BranchProbability(LBH_TAKEN_WEIGHT, Denom);
|
|
|
|
if (!ExitingEdges.empty())
|
|
|
|
Probs[2] = BranchProbability(LBH_NONTAKEN_WEIGHT, Denom);
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
if (uint32_t numBackEdges = BackEdges.size()) {
|
|
|
|
auto Prob = Probs[0] / numBackEdges;
|
|
|
|
for (unsigned SuccIdx : BackEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, Prob);
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
2011-07-28 21:33:46 +00:00
|
|
|
if (uint32_t numInEdges = InEdges.size()) {
|
2015-12-22 18:56:14 +00:00
|
|
|
auto Prob = Probs[1] / numInEdges;
|
|
|
|
for (unsigned SuccIdx : InEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, Prob);
|
2011-07-28 21:33:46 +00:00
|
|
|
}
|
|
|
|
|
2011-10-25 09:47:41 +00:00
|
|
|
if (uint32_t numExitingEdges = ExitingEdges.size()) {
|
2015-12-22 18:56:14 +00:00
|
|
|
auto Prob = Probs[2] / numExitingEdges;
|
|
|
|
for (unsigned SuccIdx : ExitingEdges)
|
|
|
|
setEdgeProbability(BB, SuccIdx, Prob);
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
2011-07-28 21:45:07 +00:00
|
|
|
|
|
|
|
return true;
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
2011-10-24 01:40:45 +00:00
|
|
|
bool BranchProbabilityInfo::calcZeroHeuristics(BasicBlock *BB) {
|
2011-07-31 03:27:24 +00:00
|
|
|
BranchInst * BI = dyn_cast<BranchInst>(BB->getTerminator());
|
|
|
|
if (!BI || !BI->isConditional())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Value *Cond = BI->getCondition();
|
|
|
|
ICmpInst *CI = dyn_cast<ICmpInst>(Cond);
|
|
|
|
if (!CI)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Value *RHS = CI->getOperand(1);
|
2011-07-31 04:47:20 +00:00
|
|
|
ConstantInt *CV = dyn_cast<ConstantInt>(RHS);
|
2011-09-04 23:53:04 +00:00
|
|
|
if (!CV)
|
2011-07-31 03:27:24 +00:00
|
|
|
return false;
|
|
|
|
|
2015-04-15 06:24:07 +00:00
|
|
|
// If the LHS is the result of AND'ing a value with a single bit bitmask,
|
|
|
|
// we don't have information about probabilities.
|
|
|
|
if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
|
|
|
|
if (LHS->getOpcode() == Instruction::And)
|
|
|
|
if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
|
|
|
|
if (AndRHS->getUniqueInteger().isPowerOf2())
|
|
|
|
return false;
|
|
|
|
|
2011-07-31 03:27:24 +00:00
|
|
|
bool isProb;
|
2011-09-04 23:53:04 +00:00
|
|
|
if (CV->isZero()) {
|
|
|
|
switch (CI->getPredicate()) {
|
|
|
|
case CmpInst::ICMP_EQ:
|
|
|
|
// X == 0 -> Unlikely
|
|
|
|
isProb = false;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_NE:
|
|
|
|
// X != 0 -> Likely
|
|
|
|
isProb = true;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_SLT:
|
|
|
|
// X < 0 -> Unlikely
|
|
|
|
isProb = false;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_SGT:
|
|
|
|
// X > 0 -> Likely
|
|
|
|
isProb = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) {
|
|
|
|
// InstCombine canonicalizes X <= 0 into X < 1.
|
|
|
|
// X <= 0 -> Unlikely
|
2011-07-31 04:47:20 +00:00
|
|
|
isProb = false;
|
2013-11-01 10:58:22 +00:00
|
|
|
} else if (CV->isAllOnesValue()) {
|
|
|
|
switch (CI->getPredicate()) {
|
|
|
|
case CmpInst::ICMP_EQ:
|
|
|
|
// X == -1 -> Unlikely
|
|
|
|
isProb = false;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_NE:
|
|
|
|
// X != -1 -> Likely
|
|
|
|
isProb = true;
|
|
|
|
break;
|
|
|
|
case CmpInst::ICMP_SGT:
|
|
|
|
// InstCombine canonicalizes X >= 0 into X > -1.
|
|
|
|
// X >= 0 -> Likely
|
|
|
|
isProb = true;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
2011-09-04 23:53:04 +00:00
|
|
|
} else {
|
2011-07-31 03:27:24 +00:00
|
|
|
return false;
|
2011-09-04 23:53:04 +00:00
|
|
|
}
|
2011-07-31 03:27:24 +00:00
|
|
|
|
2012-08-24 18:14:27 +00:00
|
|
|
unsigned TakenIdx = 0, NonTakenIdx = 1;
|
2011-07-31 03:27:24 +00:00
|
|
|
|
|
|
|
if (!isProb)
|
2012-08-24 18:14:27 +00:00
|
|
|
std::swap(TakenIdx, NonTakenIdx);
|
2011-07-31 03:27:24 +00:00
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
BranchProbability TakenProb(ZH_TAKEN_WEIGHT,
|
|
|
|
ZH_TAKEN_WEIGHT + ZH_NONTAKEN_WEIGHT);
|
|
|
|
setEdgeProbability(BB, TakenIdx, TakenProb);
|
|
|
|
setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
|
2011-07-31 03:27:24 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2011-10-24 01:40:45 +00:00
|
|
|
bool BranchProbabilityInfo::calcFloatingPointHeuristics(BasicBlock *BB) {
|
2011-10-21 20:12:47 +00:00
|
|
|
BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator());
|
|
|
|
if (!BI || !BI->isConditional())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
Value *Cond = BI->getCondition();
|
|
|
|
FCmpInst *FCmp = dyn_cast<FCmpInst>(Cond);
|
2011-10-21 21:13:47 +00:00
|
|
|
if (!FCmp)
|
2011-10-21 20:12:47 +00:00
|
|
|
return false;
|
|
|
|
|
2011-10-21 21:13:47 +00:00
|
|
|
bool isProb;
|
|
|
|
if (FCmp->isEquality()) {
|
|
|
|
// f1 == f2 -> Unlikely
|
|
|
|
// f1 != f2 -> Likely
|
|
|
|
isProb = !FCmp->isTrueWhenEqual();
|
|
|
|
} else if (FCmp->getPredicate() == FCmpInst::FCMP_ORD) {
|
|
|
|
// !isnan -> Likely
|
|
|
|
isProb = true;
|
|
|
|
} else if (FCmp->getPredicate() == FCmpInst::FCMP_UNO) {
|
|
|
|
// isnan -> Unlikely
|
|
|
|
isProb = false;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-08-24 18:14:27 +00:00
|
|
|
unsigned TakenIdx = 0, NonTakenIdx = 1;
|
2011-10-21 20:12:47 +00:00
|
|
|
|
2011-10-21 21:13:47 +00:00
|
|
|
if (!isProb)
|
2012-08-24 18:14:27 +00:00
|
|
|
std::swap(TakenIdx, NonTakenIdx);
|
2011-10-21 20:12:47 +00:00
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
BranchProbability TakenProb(FPH_TAKEN_WEIGHT,
|
|
|
|
FPH_TAKEN_WEIGHT + FPH_NONTAKEN_WEIGHT);
|
|
|
|
setEdgeProbability(BB, TakenIdx, TakenProb);
|
|
|
|
setEdgeProbability(BB, NonTakenIdx, TakenProb.getCompl());
|
2011-10-21 20:12:47 +00:00
|
|
|
return true;
|
|
|
|
}
|
2011-07-31 03:27:24 +00:00
|
|
|
|
2012-08-15 12:22:35 +00:00
|
|
|
bool BranchProbabilityInfo::calcInvokeHeuristics(BasicBlock *BB) {
|
|
|
|
InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator());
|
|
|
|
if (!II)
|
|
|
|
return false;
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
BranchProbability TakenProb(IH_TAKEN_WEIGHT,
|
|
|
|
IH_TAKEN_WEIGHT + IH_NONTAKEN_WEIGHT);
|
|
|
|
setEdgeProbability(BB, 0 /*Index for Normal*/, TakenProb);
|
|
|
|
setEdgeProbability(BB, 1 /*Index for Unwind*/, TakenProb.getCompl());
|
2012-08-15 12:22:35 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-05-28 19:43:06 +00:00
|
|
|
void BranchProbabilityInfo::releaseMemory() {
|
2015-12-22 18:56:14 +00:00
|
|
|
Probs.clear();
|
2015-05-28 19:43:06 +00:00
|
|
|
}
|
|
|
|
|
2015-07-15 22:48:29 +00:00
|
|
|
void BranchProbabilityInfo::print(raw_ostream &OS) const {
|
2011-10-23 21:21:50 +00:00
|
|
|
OS << "---- Branch Probabilities ----\n";
|
|
|
|
// We print the probabilities from the last function the analysis ran over,
|
|
|
|
// or the function it is currently running over.
|
|
|
|
assert(LastF && "Cannot print prior to running over a function");
|
Analysis: Remove implicit ilist iterator conversions
Remove implicit ilist iterator conversions from LLVMAnalysis.
I came across something really scary in `llvm::isKnownNotFullPoison()`
which relied on `Instruction::getNextNode()` being completely broken
(not surprising, but scary nevertheless). This function is documented
(and coded to) return `nullptr` when it gets to the sentinel, but with
an `ilist_half_node` as a sentinel, the sentinel check looks into some
other memory and we don't recognize we've hit the end.
Rooting out these scary cases is the reason I'm removing the implicit
conversions before doing anything else with `ilist`; I'm not at all
surprised that clients rely on badness.
I found another scary case -- this time, not relying on badness, just
bad (but I guess getting lucky so far) -- in
`ObjectSizeOffsetEvaluator::compute_()`. Here, we save out the
insertion point, do some things, and then restore it. Previously, we
let the iterator auto-convert to `Instruction*`, and then set it back
using the `Instruction*` version:
Instruction *PrevInsertPoint = Builder.GetInsertPoint();
/* Logic that may change insert point */
if (PrevInsertPoint)
Builder.SetInsertPoint(PrevInsertPoint);
The check for `PrevInsertPoint` doesn't protect correctly against bad
accesses. If the insertion point has been set to the end of a basic
block (i.e., `SetInsertPoint(SomeBB)`), then `GetInsertPoint()` returns
an iterator pointing at the list sentinel. The version of
`SetInsertPoint()` that's getting called will then call
`PrevInsertPoint->getParent()`, which explodes horribly. The only
reason this hasn't blown up is that it's fairly unlikely the builder is
adding to the end of the block; usually, we're adding instructions
somewhere before the terminator.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249925 91177308-0d34-0410-b5e6-96231b3b80d8
2015-10-10 00:53:03 +00:00
|
|
|
for (const auto &BI : *LastF) {
|
|
|
|
for (succ_const_iterator SI = succ_begin(&BI), SE = succ_end(&BI); SI != SE;
|
|
|
|
++SI) {
|
|
|
|
printEdgeProbability(OS << " ", &BI, *SI);
|
2014-07-21 17:06:51 +00:00
|
|
|
}
|
|
|
|
}
|
2011-10-23 21:21:50 +00:00
|
|
|
}
|
|
|
|
|
2011-07-29 19:30:00 +00:00
|
|
|
bool BranchProbabilityInfo::
|
|
|
|
isEdgeHot(const BasicBlock *Src, const BasicBlock *Dst) const {
|
2011-06-11 01:05:22 +00:00
|
|
|
// Hot probability is at least 4/5 = 80%
|
2011-10-23 11:19:14 +00:00
|
|
|
// FIXME: Compare against a static "hot" BranchProbability.
|
|
|
|
return getEdgeProbability(Src, Dst) > BranchProbability(4, 5);
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BasicBlock *BranchProbabilityInfo::getHotSucc(BasicBlock *BB) const {
|
2015-12-22 18:56:14 +00:00
|
|
|
auto MaxProb = BranchProbability::getZero();
|
2014-04-15 04:59:12 +00:00
|
|
|
BasicBlock *MaxSucc = nullptr;
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2014-07-21 17:06:51 +00:00
|
|
|
for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
|
|
|
|
BasicBlock *Succ = *I;
|
2015-12-22 18:56:14 +00:00
|
|
|
auto Prob = getEdgeProbability(BB, Succ);
|
|
|
|
if (Prob > MaxProb) {
|
|
|
|
MaxProb = Prob;
|
2011-06-04 01:16:30 +00:00
|
|
|
MaxSucc = Succ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-23 11:19:14 +00:00
|
|
|
// Hot probability is at least 4/5 = 80%
|
2015-12-22 18:56:14 +00:00
|
|
|
if (MaxProb > BranchProbability(4, 5))
|
2011-06-04 01:16:30 +00:00
|
|
|
return MaxSucc;
|
|
|
|
|
2014-04-15 04:59:12 +00:00
|
|
|
return nullptr;
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
/// Get the raw edge probability for the edge. If can't find it, return a
|
|
|
|
/// default probability 1/N where N is the number of successors. Here an edge is
|
|
|
|
/// specified using PredBlock and an
|
|
|
|
/// index to the successors.
|
|
|
|
BranchProbability
|
|
|
|
BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
|
|
|
|
unsigned IndexInSuccessors) const {
|
|
|
|
auto I = Probs.find(std::make_pair(Src, IndexInSuccessors));
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
if (I != Probs.end())
|
2011-06-04 01:16:30 +00:00
|
|
|
return I->second;
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
return {1,
|
|
|
|
static_cast<uint32_t>(std::distance(succ_begin(Src), succ_end(Src)))};
|
2011-06-04 01:16:30 +00:00
|
|
|
}
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
BranchProbability
|
|
|
|
BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
|
|
|
|
succ_const_iterator Dst) const {
|
|
|
|
return getEdgeProbability(Src, Dst.getSuccessorIndex());
|
2013-12-14 02:24:25 +00:00
|
|
|
}
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
/// Get the raw edge probability calculated for the block pair. This returns the
|
|
|
|
/// sum of all raw edge probabilities from Src to Dst.
|
|
|
|
BranchProbability
|
|
|
|
BranchProbabilityInfo::getEdgeProbability(const BasicBlock *Src,
|
|
|
|
const BasicBlock *Dst) const {
|
|
|
|
auto Prob = BranchProbability::getZero();
|
|
|
|
bool FoundProb = false;
|
2012-08-24 18:14:27 +00:00
|
|
|
for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
|
|
|
|
if (*I == Dst) {
|
2015-12-22 18:56:14 +00:00
|
|
|
auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
|
|
|
|
if (MapI != Probs.end()) {
|
|
|
|
FoundProb = true;
|
|
|
|
Prob += MapI->second;
|
2015-05-06 17:55:11 +00:00
|
|
|
}
|
2012-08-24 18:14:27 +00:00
|
|
|
}
|
2015-12-22 18:56:14 +00:00
|
|
|
uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
|
|
|
|
return FoundProb ? Prob : BranchProbability(1, succ_num);
|
2012-08-24 18:14:27 +00:00
|
|
|
}
|
|
|
|
|
2015-12-22 18:56:14 +00:00
|
|
|
/// Set the edge probability for a given edge specified by PredBlock and an
|
|
|
|
/// index to the successors.
|
|
|
|
void BranchProbabilityInfo::setEdgeProbability(const BasicBlock *Src,
|
|
|
|
unsigned IndexInSuccessors,
|
|
|
|
BranchProbability Prob) {
|
|
|
|
Probs[std::make_pair(Src, IndexInSuccessors)] = Prob;
|
|
|
|
DEBUG(dbgs() << "set edge " << Src->getName() << " -> " << IndexInSuccessors
|
|
|
|
<< " successor probability to " << Prob << "\n");
|
2015-12-01 05:29:22 +00:00
|
|
|
}
|
|
|
|
|
2011-06-11 01:05:22 +00:00
|
|
|
raw_ostream &
|
2011-10-23 21:21:50 +00:00
|
|
|
BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS,
|
|
|
|
const BasicBlock *Src,
|
|
|
|
const BasicBlock *Dst) const {
|
2011-06-04 01:16:30 +00:00
|
|
|
|
2011-06-16 20:22:37 +00:00
|
|
|
const BranchProbability Prob = getEdgeProbability(Src, Dst);
|
2011-11-15 16:27:03 +00:00
|
|
|
OS << "edge " << Src->getName() << " -> " << Dst->getName()
|
2011-06-11 01:05:22 +00:00
|
|
|
<< " probability is " << Prob
|
|
|
|
<< (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
|
2011-06-04 01:16:30 +00:00
|
|
|
|
|
|
|
return OS;
|
|
|
|
}
|
2015-07-15 22:48:29 +00:00
|
|
|
|
|
|
|
void BranchProbabilityInfo::calculate(Function &F, const LoopInfo& LI) {
|
|
|
|
DEBUG(dbgs() << "---- Branch Probability Info : " << F.getName()
|
|
|
|
<< " ----\n\n");
|
|
|
|
LastF = &F; // Store the last function we ran on for printing.
|
|
|
|
assert(PostDominatedByUnreachable.empty());
|
|
|
|
assert(PostDominatedByColdCall.empty());
|
|
|
|
|
|
|
|
// Walk the basic blocks in post-order so that we can build up state about
|
|
|
|
// the successors of a block iteratively.
|
|
|
|
for (auto BB : post_order(&F.getEntryBlock())) {
|
|
|
|
DEBUG(dbgs() << "Computing probabilities for " << BB->getName() << "\n");
|
|
|
|
if (calcUnreachableHeuristics(BB))
|
|
|
|
continue;
|
|
|
|
if (calcMetadataWeights(BB))
|
|
|
|
continue;
|
|
|
|
if (calcColdCallHeuristics(BB))
|
|
|
|
continue;
|
|
|
|
if (calcLoopBranchHeuristics(BB, LI))
|
|
|
|
continue;
|
|
|
|
if (calcPointerHeuristics(BB))
|
|
|
|
continue;
|
|
|
|
if (calcZeroHeuristics(BB))
|
|
|
|
continue;
|
|
|
|
if (calcFloatingPointHeuristics(BB))
|
|
|
|
continue;
|
|
|
|
calcInvokeHeuristics(BB);
|
|
|
|
}
|
|
|
|
|
|
|
|
PostDominatedByUnreachable.clear();
|
|
|
|
PostDominatedByColdCall.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void BranchProbabilityInfoWrapperPass::getAnalysisUsage(
|
|
|
|
AnalysisUsage &AU) const {
|
|
|
|
AU.addRequired<LoopInfoWrapperPass>();
|
|
|
|
AU.setPreservesAll();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool BranchProbabilityInfoWrapperPass::runOnFunction(Function &F) {
|
|
|
|
const LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
|
|
|
BPI.calculate(F, LI);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void BranchProbabilityInfoWrapperPass::releaseMemory() { BPI.releaseMemory(); }
|
|
|
|
|
|
|
|
void BranchProbabilityInfoWrapperPass::print(raw_ostream &OS,
|
|
|
|
const Module *) const {
|
|
|
|
BPI.print(OS);
|
|
|
|
}
|