forked from OSchip/llvm-project
replace duplicated static functions for profile metadata access with BranchInst member function; NFCI
llvm-svn: 267295
This commit is contained in:
parent
179d1f5dad
commit
dc88bd6e1f
|
@ -2906,6 +2906,10 @@ public:
|
|||
/// continues to map correctly to each operand.
|
||||
void swapSuccessors();
|
||||
|
||||
/// Retrieve the probabilities of a conditional branch. Returns true on
|
||||
/// success, or returns false if no or invalid metadata was found.
|
||||
bool extractProfMetadata(uint64_t &ProbTrue, uint64_t &ProbFalse);
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return (I->getOpcode() == Instruction::Br);
|
||||
|
|
|
@ -5427,29 +5427,6 @@ bool CodeGenPrepare::sinkAndCmp(Function &F) {
|
|||
return MadeChange;
|
||||
}
|
||||
|
||||
/// \brief Retrieve the probabilities of a conditional branch. Returns true on
|
||||
/// success, 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?");
|
||||
auto *ProfileData = BI->getMetadata(LLVMContext::MD_prof);
|
||||
if (!ProfileData || ProfileData->getNumOperands() != 3)
|
||||
return false;
|
||||
|
||||
const auto *CITrue =
|
||||
mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1));
|
||||
const auto *CIFalse =
|
||||
mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2));
|
||||
if (!CITrue || !CIFalse)
|
||||
return false;
|
||||
|
||||
ProbTrue = CITrue->getValue().getZExtValue();
|
||||
ProbFalse = CIFalse->getValue().getZExtValue();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// \brief Scale down both weights to fit into uint32_t.
|
||||
static void scaleWeights(uint64_t &NewTrue, uint64_t &NewFalse) {
|
||||
uint64_t NewMax = (NewTrue > NewFalse) ? NewTrue : NewFalse;
|
||||
|
@ -5595,7 +5572,7 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
|
|||
// Another choice is to assume TrueProb for BB1 equals to TrueProb for
|
||||
// TmpBB, but the math is more complicated.
|
||||
uint64_t TrueWeight, FalseWeight;
|
||||
if (extractBranchMetadata(Br1, TrueWeight, FalseWeight)) {
|
||||
if (Br1->extractProfMetadata(TrueWeight, FalseWeight)) {
|
||||
uint64_t NewTrueWeight = TrueWeight;
|
||||
uint64_t NewFalseWeight = TrueWeight + 2 * FalseWeight;
|
||||
scaleWeights(NewTrueWeight, NewFalseWeight);
|
||||
|
@ -5628,7 +5605,7 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
|
|||
// assumes that
|
||||
// FalseProb for BB1 == TrueProb for BB1 * FalseProb for TmpBB.
|
||||
uint64_t TrueWeight, FalseWeight;
|
||||
if (extractBranchMetadata(Br1, TrueWeight, FalseWeight)) {
|
||||
if (Br1->extractProfMetadata(TrueWeight, FalseWeight)) {
|
||||
uint64_t NewTrueWeight = 2 * TrueWeight + FalseWeight;
|
||||
uint64_t NewFalseWeight = FalseWeight;
|
||||
scaleWeights(NewTrueWeight, NewFalseWeight);
|
||||
|
|
|
@ -1120,6 +1120,24 @@ void BranchInst::swapSuccessors() {
|
|||
MDNode::get(ProfileData->getContext(), Ops));
|
||||
}
|
||||
|
||||
bool BranchInst::extractProfMetadata(uint64_t &ProbTrue, uint64_t &ProbFalse) {
|
||||
assert(isConditional() &&
|
||||
"Looking for probabilities on unconditional branch?");
|
||||
auto *ProfileData = getMetadata(LLVMContext::MD_prof);
|
||||
if (!ProfileData || ProfileData->getNumOperands() != 3)
|
||||
return false;
|
||||
|
||||
auto *CITrue = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1));
|
||||
auto *CIFalse = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2));
|
||||
if (!CITrue || !CIFalse)
|
||||
return false;
|
||||
|
||||
ProbTrue = CITrue->getValue().getZExtValue();
|
||||
ProbFalse = CIFalse->getValue().getZExtValue();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
BasicBlock *BranchInst::getSuccessorV(unsigned idx) const {
|
||||
return getSuccessor(idx);
|
||||
}
|
||||
|
|
|
@ -2042,25 +2042,6 @@ static bool SimplifyCondBranchToTwoReturns(BranchInst *BI,
|
|||
return true;
|
||||
}
|
||||
|
||||
/// Given a conditional BranchInstruction, retrieve the probabilities of the
|
||||
/// branch taking each edge. Fills in the two APInt parameters and returns 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 =
|
||||
mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1));
|
||||
ConstantInt *CIFalse =
|
||||
mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2));
|
||||
if (!CITrue || !CIFalse) return false;
|
||||
ProbTrue = CITrue->getValue().getZExtValue();
|
||||
ProbFalse = CIFalse->getValue().getZExtValue();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Return true if the given instruction is available
|
||||
/// in its predecessor block. If yes, the instruction will be removed.
|
||||
static bool checkCSEInPredecessor(Instruction *Inst, BasicBlock *PB) {
|
||||
|
@ -2267,10 +2248,10 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, unsigned BonusInstThreshold) {
|
|||
PBI->setCondition(NewCond);
|
||||
|
||||
uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight;
|
||||
bool PredHasWeights = ExtractBranchMetadata(PBI, PredTrueWeight,
|
||||
PredFalseWeight);
|
||||
bool SuccHasWeights = ExtractBranchMetadata(BI, SuccTrueWeight,
|
||||
SuccFalseWeight);
|
||||
bool PredHasWeights =
|
||||
PBI->extractProfMetadata(PredTrueWeight, PredFalseWeight);
|
||||
bool SuccHasWeights =
|
||||
BI->extractProfMetadata(SuccTrueWeight, SuccFalseWeight);
|
||||
SmallVector<uint64_t, 8> NewWeights;
|
||||
|
||||
if (PBI->getSuccessor(0) == BB) {
|
||||
|
@ -2853,10 +2834,10 @@ 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->extractProfMetadata(PredTrueWeight, PredFalseWeight);
|
||||
bool SuccHasWeights =
|
||||
BI->extractProfMetadata(SuccTrueWeight, SuccFalseWeight);
|
||||
if (PredHasWeights && SuccHasWeights) {
|
||||
uint64_t PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight;
|
||||
uint64_t PredOther = PBIOp ?PredTrueWeight : PredFalseWeight;
|
||||
|
|
Loading…
Reference in New Issue