mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Use getEdgeProbability() instead of getEdgeWeight() in BFI and remove getEdgeWeight() interfaces from MBPI.
This patch removes all getEdgeWeight() interfaces from CodeGen directory. As getEdgeProbability() is a little more expensive than getEdgeWeight(), I will compose a patch soon in which BPI only stores probabilities instead of edge weights so that getEdgeProbability() will have O(1) time. Differential revision: http://reviews.llvm.org/D15489 llvm-svn: 256039
This commit is contained in:
parent
76a12162c8
commit
d24cdaa414
@ -1173,6 +1173,13 @@ void BlockFrequencyInfoImpl<BT>::computeIrreducibleMass(
|
||||
updateLoopWithIrreducible(*OuterLoop);
|
||||
}
|
||||
|
||||
namespace {
|
||||
// A helper function that converts a branch probability into weight.
|
||||
inline uint32_t getWeightFromBranchProb(const BranchProbability Prob) {
|
||||
return Prob.getNumerator();
|
||||
}
|
||||
} // namespace
|
||||
|
||||
template <class BT>
|
||||
bool
|
||||
BlockFrequencyInfoImpl<BT>::propagateMassToSuccessors(LoopData *OuterLoop,
|
||||
@ -1189,10 +1196,8 @@ BlockFrequencyInfoImpl<BT>::propagateMassToSuccessors(LoopData *OuterLoop,
|
||||
const BlockT *BB = getBlock(Node);
|
||||
for (auto SI = Successor::child_begin(BB), SE = Successor::child_end(BB);
|
||||
SI != SE; ++SI)
|
||||
// Do not dereference SI, or getEdgeWeight() is linear in the number of
|
||||
// successors.
|
||||
if (!addToDist(Dist, OuterLoop, Node, getNode(*SI),
|
||||
BPI->getEdgeWeight(BB, SI)))
|
||||
getWeightFromBranchProb(BPI->getEdgeProbability(BB, SI))))
|
||||
// Irreducible backedge.
|
||||
return false;
|
||||
}
|
||||
|
@ -45,16 +45,6 @@ public:
|
||||
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;
|
||||
|
@ -28,19 +28,6 @@ char MachineBranchProbabilityInfo::ID = 0;
|
||||
|
||||
void MachineBranchProbabilityInfo::anchor() { }
|
||||
|
||||
uint32_t MachineBranchProbabilityInfo::getEdgeWeight(
|
||||
const MachineBasicBlock *Src,
|
||||
MachineBasicBlock::const_succ_iterator Dst) const {
|
||||
return Src->getSuccProbability(Dst).getNumerator();
|
||||
}
|
||||
|
||||
uint32_t MachineBranchProbabilityInfo::getEdgeWeight(
|
||||
const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
|
||||
// This is a linear search. Try to use the const_succ_iterator version when
|
||||
// possible.
|
||||
return getEdgeWeight(Src, std::find(Src->succ_begin(), Src->succ_end(), Dst));
|
||||
}
|
||||
|
||||
BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
|
||||
const MachineBasicBlock *Src,
|
||||
MachineBasicBlock::const_succ_iterator Dst) const {
|
||||
|
@ -9,8 +9,8 @@ define void @branch_weight_0(i32 %a) {
|
||||
entry:
|
||||
br label %for.body
|
||||
|
||||
; Check that we get 1,4 instead of 0,3.
|
||||
; CHECK-NEXT: for.body: float = 4.0,
|
||||
; Check that we get 1 and a huge frequency instead of 0,3.
|
||||
; CHECK-NEXT: for.body: float = 2147483647.8,
|
||||
for.body:
|
||||
%i = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
||||
call void @g(i32 %i)
|
||||
|
Loading…
x
Reference in New Issue
Block a user