mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
Use BranchProbability instead of floating points in IfConverter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134858 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
687dc24e1d
commit
f81b7f6069
@ -32,6 +32,7 @@ class SelectionDAG;
|
||||
class ScheduleDAG;
|
||||
class TargetRegisterClass;
|
||||
class TargetRegisterInfo;
|
||||
class BranchProbability;
|
||||
|
||||
template<class T> class SmallVectorImpl;
|
||||
|
||||
@ -321,7 +322,7 @@ public:
|
||||
virtual
|
||||
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCyles,
|
||||
unsigned ExtraPredCycles,
|
||||
float Probability, float Confidence) const {
|
||||
const BranchProbability &Probability) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -336,7 +337,7 @@ public:
|
||||
unsigned NumTCycles, unsigned ExtraTCycles,
|
||||
MachineBasicBlock &FMBB,
|
||||
unsigned NumFCycles, unsigned ExtraFCycles,
|
||||
float Probability, float Confidence) const {
|
||||
const BranchProbability &Probability) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -348,7 +349,7 @@ public:
|
||||
/// will be properly predicted.
|
||||
virtual bool
|
||||
isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCyles,
|
||||
float Probability, float Confidence) const {
|
||||
const BranchProbability &Probability) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -173,10 +174,10 @@ namespace {
|
||||
private:
|
||||
bool ReverseBranchCondition(BBInfo &BBI);
|
||||
bool ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
|
||||
float Prediction, float Confidence) const;
|
||||
const BranchProbability &Prediction) const;
|
||||
bool ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
||||
bool FalseBranch, unsigned &Dups,
|
||||
float Prediction, float Confidence) const;
|
||||
const BranchProbability &Prediction) const;
|
||||
bool ValidDiamond(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
||||
unsigned &Dups1, unsigned &Dups2) const;
|
||||
void ScanInstructions(BBInfo &BBI);
|
||||
@ -203,19 +204,19 @@ namespace {
|
||||
|
||||
bool MeetIfcvtSizeLimit(MachineBasicBlock &BB,
|
||||
unsigned Cycle, unsigned Extra,
|
||||
float Prediction, float Confidence) const {
|
||||
const BranchProbability &Prediction) const {
|
||||
return Cycle > 0 && TII->isProfitableToIfCvt(BB, Cycle, Extra,
|
||||
Prediction, Confidence);
|
||||
Prediction);
|
||||
}
|
||||
|
||||
bool MeetIfcvtSizeLimit(MachineBasicBlock &TBB,
|
||||
unsigned TCycle, unsigned TExtra,
|
||||
MachineBasicBlock &FBB,
|
||||
unsigned FCycle, unsigned FExtra,
|
||||
float Prediction, float Confidence) const {
|
||||
const BranchProbability &Prediction) const {
|
||||
return TCycle > 0 && FCycle > 0 &&
|
||||
TII->isProfitableToIfCvt(TBB, TCycle, TExtra, FBB, FCycle, FExtra,
|
||||
Prediction, Confidence);
|
||||
Prediction);
|
||||
}
|
||||
|
||||
// blockAlwaysFallThrough - Block ends without a terminator.
|
||||
@ -450,7 +451,7 @@ static inline MachineBasicBlock *getNextBlock(MachineBasicBlock *BB) {
|
||||
/// number of instructions that the ifcvt would need to duplicate if performed
|
||||
/// in Dups.
|
||||
bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
|
||||
float Prediction, float Confidence) const {
|
||||
const BranchProbability &Prediction) const {
|
||||
Dups = 0;
|
||||
if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
|
||||
return false;
|
||||
@ -461,7 +462,7 @@ bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
|
||||
if (TrueBBI.BB->pred_size() > 1) {
|
||||
if (TrueBBI.CannotBeCopied ||
|
||||
!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, TrueBBI.NonPredSize,
|
||||
Prediction, Confidence))
|
||||
Prediction))
|
||||
return false;
|
||||
Dups = TrueBBI.NonPredSize;
|
||||
}
|
||||
@ -477,7 +478,7 @@ bool IfConverter::ValidSimple(BBInfo &TrueBBI, unsigned &Dups,
|
||||
/// if performed in 'Dups'.
|
||||
bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
||||
bool FalseBranch, unsigned &Dups,
|
||||
float Prediction, float Confidence) const {
|
||||
const BranchProbability &Prediction) const {
|
||||
Dups = 0;
|
||||
if (TrueBBI.IsBeingAnalyzed || TrueBBI.IsDone)
|
||||
return false;
|
||||
@ -499,8 +500,7 @@ bool IfConverter::ValidTriangle(BBInfo &TrueBBI, BBInfo &FalseBBI,
|
||||
++Size;
|
||||
}
|
||||
}
|
||||
if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size,
|
||||
Prediction, Confidence))
|
||||
if (!TII->isProfitableToDupForIfCvt(*TrueBBI.BB, Size, Prediction))
|
||||
return false;
|
||||
Dups = Size;
|
||||
}
|
||||
@ -796,21 +796,20 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
// - backedge -> 90% taken
|
||||
// - early exit -> 20% taken
|
||||
// - branch predictor confidence -> 90%
|
||||
float Prediction = 0.5f;
|
||||
float Confidence = 0.9f;
|
||||
BranchProbability Prediction(5, 10);
|
||||
MachineLoop *Loop = MLI->getLoopFor(BB);
|
||||
if (Loop) {
|
||||
if (TrueBBI.BB == Loop->getHeader())
|
||||
Prediction = 0.9f;
|
||||
Prediction = BranchProbability(9, 10);
|
||||
else if (FalseBBI.BB == Loop->getHeader())
|
||||
Prediction = 0.1f;
|
||||
Prediction = BranchProbability(1, 10);
|
||||
|
||||
MachineLoop *TrueLoop = MLI->getLoopFor(TrueBBI.BB);
|
||||
MachineLoop *FalseLoop = MLI->getLoopFor(FalseBBI.BB);
|
||||
if (!TrueLoop || TrueLoop->getParentLoop() == Loop)
|
||||
Prediction = 0.2f;
|
||||
Prediction = BranchProbability(2, 10);
|
||||
else if (!FalseLoop || FalseLoop->getParentLoop() == Loop)
|
||||
Prediction = 0.8f;
|
||||
Prediction = BranchProbability(8, 10);
|
||||
}
|
||||
|
||||
if (CanRevCond && ValidDiamond(TrueBBI, FalseBBI, Dups, Dups2) &&
|
||||
@ -818,7 +817,7 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
TrueBBI.ExtraCost), TrueBBI.ExtraCost2,
|
||||
*FalseBBI.BB, (FalseBBI.NonPredSize - (Dups + Dups2) +
|
||||
FalseBBI.ExtraCost),FalseBBI.ExtraCost2,
|
||||
Prediction, Confidence) &&
|
||||
Prediction) &&
|
||||
FeasibilityAnalysis(TrueBBI, BBI.BrCond) &&
|
||||
FeasibilityAnalysis(FalseBBI, RevCond)) {
|
||||
// Diamond:
|
||||
@ -834,9 +833,9 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
Enqueued = true;
|
||||
}
|
||||
|
||||
if (ValidTriangle(TrueBBI, FalseBBI, false, Dups, Prediction, Confidence) &&
|
||||
if (ValidTriangle(TrueBBI, FalseBBI, false, Dups, Prediction) &&
|
||||
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
|
||||
TrueBBI.ExtraCost2, Prediction, Confidence) &&
|
||||
TrueBBI.ExtraCost2, Prediction) &&
|
||||
FeasibilityAnalysis(TrueBBI, BBI.BrCond, true)) {
|
||||
// Triangle:
|
||||
// EBB
|
||||
@ -849,17 +848,17 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
Enqueued = true;
|
||||
}
|
||||
|
||||
if (ValidTriangle(TrueBBI, FalseBBI, true, Dups, Prediction, Confidence) &&
|
||||
if (ValidTriangle(TrueBBI, FalseBBI, true, Dups, Prediction) &&
|
||||
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
|
||||
TrueBBI.ExtraCost2, Prediction, Confidence) &&
|
||||
TrueBBI.ExtraCost2, Prediction) &&
|
||||
FeasibilityAnalysis(TrueBBI, BBI.BrCond, true, true)) {
|
||||
Tokens.push_back(new IfcvtToken(BBI, ICTriangleRev, TNeedSub, Dups));
|
||||
Enqueued = true;
|
||||
}
|
||||
|
||||
if (ValidSimple(TrueBBI, Dups, Prediction, Confidence) &&
|
||||
if (ValidSimple(TrueBBI, Dups, Prediction) &&
|
||||
MeetIfcvtSizeLimit(*TrueBBI.BB, TrueBBI.NonPredSize + TrueBBI.ExtraCost,
|
||||
TrueBBI.ExtraCost2, Prediction, Confidence) &&
|
||||
TrueBBI.ExtraCost2, Prediction) &&
|
||||
FeasibilityAnalysis(TrueBBI, BBI.BrCond)) {
|
||||
// Simple (split, no rejoin):
|
||||
// EBB
|
||||
@ -875,29 +874,29 @@ IfConverter::BBInfo &IfConverter::AnalyzeBlock(MachineBasicBlock *BB,
|
||||
if (CanRevCond) {
|
||||
// Try the other path...
|
||||
if (ValidTriangle(FalseBBI, TrueBBI, false, Dups,
|
||||
1.0-Prediction, Confidence) &&
|
||||
Prediction.getCompl()) &&
|
||||
MeetIfcvtSizeLimit(*FalseBBI.BB,
|
||||
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
|
||||
FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
|
||||
FalseBBI.ExtraCost2, Prediction.getCompl()) &&
|
||||
FeasibilityAnalysis(FalseBBI, RevCond, true)) {
|
||||
Tokens.push_back(new IfcvtToken(BBI, ICTriangleFalse, FNeedSub, Dups));
|
||||
Enqueued = true;
|
||||
}
|
||||
|
||||
if (ValidTriangle(FalseBBI, TrueBBI, true, Dups,
|
||||
1.0-Prediction, Confidence) &&
|
||||
Prediction.getCompl()) &&
|
||||
MeetIfcvtSizeLimit(*FalseBBI.BB,
|
||||
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
|
||||
FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
|
||||
FalseBBI.ExtraCost2, Prediction.getCompl()) &&
|
||||
FeasibilityAnalysis(FalseBBI, RevCond, true, true)) {
|
||||
Tokens.push_back(new IfcvtToken(BBI, ICTriangleFRev, FNeedSub, Dups));
|
||||
Enqueued = true;
|
||||
}
|
||||
|
||||
if (ValidSimple(FalseBBI, Dups, 1.0-Prediction, Confidence) &&
|
||||
if (ValidSimple(FalseBBI, Dups, Prediction.getCompl()) &&
|
||||
MeetIfcvtSizeLimit(*FalseBBI.BB,
|
||||
FalseBBI.NonPredSize + FalseBBI.ExtraCost,
|
||||
FalseBBI.ExtraCost2, 1.0-Prediction, Confidence) &&
|
||||
FalseBBI.ExtraCost2, Prediction.getCompl()) &&
|
||||
FeasibilityAnalysis(FalseBBI, RevCond)) {
|
||||
Tokens.push_back(new IfcvtToken(BBI, ICSimpleFalse, FNeedSub, Dups));
|
||||
Enqueued = true;
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -1273,20 +1274,20 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::isProfitableToIfCvt(MachineBasicBlock &MBB,
|
||||
unsigned NumCycles,
|
||||
unsigned ExtraPredCycles,
|
||||
float Probability,
|
||||
float Confidence) const {
|
||||
bool ARMBaseInstrInfo::
|
||||
isProfitableToIfCvt(MachineBasicBlock &MBB,
|
||||
unsigned NumCycles, unsigned ExtraPredCycles,
|
||||
const BranchProbability &Probability) const {
|
||||
if (!NumCycles)
|
||||
return false;
|
||||
|
||||
// Attempt to estimate the relative costs of predication versus branching.
|
||||
float UnpredCost = Probability * NumCycles;
|
||||
UnpredCost += 1.0; // The branch itself
|
||||
UnpredCost += (1.0 - Confidence) * Subtarget.getMispredictionPenalty();
|
||||
unsigned UnpredCost = Probability.getNumerator() * NumCycles;
|
||||
UnpredCost /= Probability.getDenominator();
|
||||
UnpredCost += 1; // The branch itself
|
||||
UnpredCost += Subtarget.getMispredictionPenalty() / 10;
|
||||
|
||||
return (float)(NumCycles + ExtraPredCycles) < UnpredCost;
|
||||
return (NumCycles + ExtraPredCycles) <= UnpredCost;
|
||||
}
|
||||
|
||||
bool ARMBaseInstrInfo::
|
||||
@ -1294,16 +1295,23 @@ isProfitableToIfCvt(MachineBasicBlock &TMBB,
|
||||
unsigned TCycles, unsigned TExtra,
|
||||
MachineBasicBlock &FMBB,
|
||||
unsigned FCycles, unsigned FExtra,
|
||||
float Probability, float Confidence) const {
|
||||
const BranchProbability &Probability) const {
|
||||
if (!TCycles || !FCycles)
|
||||
return false;
|
||||
|
||||
// Attempt to estimate the relative costs of predication versus branching.
|
||||
float UnpredCost = Probability * TCycles + (1.0 - Probability) * FCycles;
|
||||
UnpredCost += 1.0; // The branch itself
|
||||
UnpredCost += (1.0 - Confidence) * Subtarget.getMispredictionPenalty();
|
||||
unsigned TUnpredCost = Probability.getNumerator() * TCycles;
|
||||
TUnpredCost /= Probability.getDenominator();
|
||||
|
||||
uint32_t Comp = Probability.getDenominator() - Probability.getNumerator();
|
||||
unsigned FUnpredCost = Comp * FCycles;
|
||||
FUnpredCost /= Probability.getDenominator();
|
||||
|
||||
return (float)(TCycles + FCycles + TExtra + FExtra) < UnpredCost;
|
||||
unsigned UnpredCost = TUnpredCost + FUnpredCost;
|
||||
UnpredCost += 1; // The branch itself
|
||||
UnpredCost += Subtarget.getMispredictionPenalty() / 10;
|
||||
|
||||
return (TCycles + FCycles + TExtra + FExtra) <= UnpredCost;
|
||||
}
|
||||
|
||||
/// getInstrPredicate - If instruction is predicated, returns its predicate
|
||||
|
@ -311,18 +311,18 @@ public:
|
||||
|
||||
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB,
|
||||
unsigned NumCycles, unsigned ExtraPredCycles,
|
||||
float Prob, float Confidence) const;
|
||||
const BranchProbability &Probability) const;
|
||||
|
||||
virtual bool isProfitableToIfCvt(MachineBasicBlock &TMBB,
|
||||
unsigned NumT, unsigned ExtraT,
|
||||
MachineBasicBlock &FMBB,
|
||||
unsigned NumF, unsigned ExtraF,
|
||||
float Probability, float Confidence) const;
|
||||
const BranchProbability &Probability) const;
|
||||
|
||||
virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB,
|
||||
unsigned NumCycles,
|
||||
float Probability,
|
||||
float Confidence) const {
|
||||
const BranchProbability
|
||||
&Probability) const {
|
||||
return NumCycles == 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user