From: Juergen Ributzka Date: Tue, 9 Dec 2014 17:32:12 +0000 (+0000) Subject: Revert "Move function to obtain branch weights into the BranchInst class. NFC." X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=194350a93697fc8f16dceb08d511c574fd423804;p=platform%2Fupstream%2Fllvm.git Revert "Move function to obtain branch weights into the BranchInst class. NFC." This reverts commit r223784 and copies the 'ExtractBranchMetadata' to CodeGenPrepare. llvm-svn: 223795 --- diff --git a/llvm/include/llvm/IR/Instructions.h b/llvm/include/llvm/IR/Instructions.h index 5157ca6..dcf19e0 100644 --- a/llvm/include/llvm/IR/Instructions.h +++ b/llvm/include/llvm/IR/Instructions.h @@ -2535,10 +2535,6 @@ 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); diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 8b92cf2..e043bfb 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -3800,6 +3800,27 @@ 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 = dyn_cast(ProfileData->getOperand(1)); + const auto *CIFalse = dyn_cast(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; @@ -3942,7 +3963,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 (Br1->getBranchWeights(TrueWeight, FalseWeight)) { + if (extractBranchMetadata(Br1, TrueWeight, FalseWeight)) { uint64_t NewTrueWeight = TrueWeight; uint64_t NewFalseWeight = TrueWeight + 2 * FalseWeight; scaleWeights(NewTrueWeight, NewFalseWeight); @@ -3975,7 +3996,7 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) { // assumes that // FalseProb for BB1 == TrueProb for BB1 * FalseProb for TmpBB. uint64_t TrueWeight, FalseWeight; - if (Br1->getBranchWeights(TrueWeight, FalseWeight)) { + if (extractBranchMetadata(Br1, TrueWeight, FalseWeight)) { uint64_t NewTrueWeight = 2 * TrueWeight + FalseWeight; uint64_t NewFalseWeight = FalseWeight; scaleWeights(NewTrueWeight, NewFalseWeight); diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 5ea4535..f4c6a28 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -805,26 +805,6 @@ 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(MD->getOperand(1)); - auto *FalseCI = dyn_cast(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); } diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 3efb89a..daa576c 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2027,6 +2027,24 @@ 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(ProfileData->getOperand(1)); + ConstantInt *CIFalse = dyn_cast(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. /// @@ -2232,10 +2250,10 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI, const DataLayout *DL, PBI->setCondition(NewCond); uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight; - bool PredHasWeights = - PBI->getBranchWeights(PredTrueWeight, PredFalseWeight); - bool SuccHasWeights = - BI->getBranchWeights(SuccTrueWeight, SuccFalseWeight); + bool PredHasWeights = ExtractBranchMetadata(PBI, PredTrueWeight, + PredFalseWeight); + bool SuccHasWeights = ExtractBranchMetadata(BI, SuccTrueWeight, + SuccFalseWeight); SmallVector NewWeights; if (PBI->getSuccessor(0) == BB) { @@ -2505,8 +2523,10 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI) { // Update branch weight for PBI. uint64_t PredTrueWeight, PredFalseWeight, SuccTrueWeight, SuccFalseWeight; - bool PredHasWeights = PBI->getBranchWeights(PredTrueWeight, PredFalseWeight); - bool SuccHasWeights = BI->getBranchWeights(SuccTrueWeight, SuccFalseWeight); + bool PredHasWeights = ExtractBranchMetadata(PBI, PredTrueWeight, + PredFalseWeight); + bool SuccHasWeights = ExtractBranchMetadata(BI, SuccTrueWeight, + SuccFalseWeight); if (PredHasWeights && SuccHasWeights) { uint64_t PredCommon = PBIOp ? PredFalseWeight : PredTrueWeight; uint64_t PredOther = PBIOp ?PredTrueWeight : PredFalseWeight;