mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-04 02:47:25 +00:00
Move function to obtain branch weights into the BranchInst class. NFC.
Make this function available to other parts of LLVM. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223784 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b900895384
commit
50f10eb432
@ -2535,6 +2535,10 @@ public:
|
||||
/// continues to map correctly to each operand.
|
||||
void swapSuccessors();
|
||||
|
||||
/// \brief Retrieve the probabilities of a conditional branch. Returns true on
|
||||
/// success, or returns false if no or invalid metadata was found.
|
||||
bool getBranchWeights(uint64_t &TrueWeight, uint64_t &FalseWeight) const;
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return (I->getOpcode() == Instruction::Br);
|
||||
|
@ -805,6 +805,26 @@ void BranchInst::swapSuccessors() {
|
||||
MDNode::get(ProfileData->getContext(), Ops));
|
||||
}
|
||||
|
||||
bool BranchInst::getBranchWeights(uint64_t &TrueWeight,
|
||||
uint64_t &FalseWeight) const {
|
||||
if (isUnconditional())
|
||||
return false;
|
||||
|
||||
auto *MD = getMetadata(LLVMContext::MD_prof);
|
||||
if (!MD || MD->getNumOperands() != 3)
|
||||
return false;
|
||||
|
||||
auto *TrueCI = dyn_cast<ConstantInt>(MD->getOperand(1));
|
||||
auto *FalseCI = dyn_cast<ConstantInt>(MD->getOperand(2));
|
||||
if (!TrueCI || !FalseCI)
|
||||
return false;
|
||||
|
||||
TrueWeight = TrueCI->getValue().getZExtValue();
|
||||
FalseWeight = FalseCI->getValue().getZExtValue();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
BasicBlock *BranchInst::getSuccessorV(unsigned idx) const {
|
||||
return getSuccessor(idx);
|
||||
}
|
||||
|
@ -2027,24 +2027,6 @@ static bool SimplifyCondBranchToTwoReturns(BranchInst *BI,
|
||||
return true;
|
||||
}
|
||||
|
||||
/// ExtractBranchMetadata - Given a conditional BranchInstruction, retrieve the
|
||||
/// probabilities of the branch taking each edge. Fills in the two APInt
|
||||
/// parameters and return true, or returns false if no or invalid metadata was
|
||||
/// found.
|
||||
static bool ExtractBranchMetadata(BranchInst *BI,
|
||||
uint64_t &ProbTrue, uint64_t &ProbFalse) {
|
||||
assert(BI->isConditional() &&
|
||||
"Looking for probabilities on unconditional branch?");
|
||||
MDNode *ProfileData = BI->getMetadata(LLVMContext::MD_prof);
|
||||
if (!ProfileData || ProfileData->getNumOperands() != 3) return false;
|
||||
ConstantInt *CITrue = dyn_cast<ConstantInt>(ProfileData->getOperand(1));
|
||||
ConstantInt *CIFalse = dyn_cast<ConstantInt>(ProfileData->getOperand(2));
|
||||
if (!CITrue || !CIFalse) return false;
|
||||
ProbTrue = CITrue->getValue().getZExtValue();
|
||||
ProbFalse = CIFalse->getValue().getZExtValue();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// checkCSEInPredecessor - Return true if the given instruction is available
|
||||
/// in its predecessor block. If yes, the instruction will be removed.
|
||||
///
|
||||
@ -2250,10 +2232,10 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, const DataLayout *DL,
|
||||
PBI->setCondition(NewCond);
|
||||
|
||||
uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
|
||||
bool PredHasWeights = ExtractBranchMetadata(PBI, PredTrueWeight,
|
||||
PredFalseWeight);
|
||||
bool SuccHasWeights = ExtractBranchMetadata(BI, SuccTrueWeight,
|
||||
SuccFalseWeight);
|
||||
bool PredHasWeights =
|
||||
PBI->getBranchWeights(PredTrueWeight, PredFalseWeight);
|
||||
bool SuccHasWeights =
|
||||
BI->getBranchWeights(SuccTrueWeight, SuccFalseWeight);
|
||||
SmallVector<uint64_t, 8> NewWeights;
|
||||
|
||||
if (PBI->getSuccessor(0) == BB) {
|
||||
@ -2523,10 +2505,8 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI) {
|
||||
|
||||
// Update branch weight for PBI.
|
||||
uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
|
||||
bool PredHasWeights = ExtractBranchMetadata(PBI, PredTrueWeight,
|
||||
PredFalseWeight);
|
||||
bool SuccHasWeights = ExtractBranchMetadata(BI, SuccTrueWeight,
|
||||
SuccFalseWeight);
|
||||
bool PredHasWeights = PBI->getBranchWeights(PredTrueWeight, PredFalseWeight);
|
||||
bool SuccHasWeights = BI->getBranchWeights(SuccTrueWeight, SuccFalseWeight);
|
||||
if (PredHasWeights && SuccHasWeights) {
|
||||
uint64_t PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight;
|
||||
uint64_t PredOther = PBIOp ?PredTrueWeight : PredFalseWeight;
|
||||
|
Loading…
x
Reference in New Issue
Block a user