[llvm-commits] [llvm] r133776 - in /llvm/trunk: include/llvm/Analysis/BlockFrequencyImpl.h include/llvm/Analysis/BranchProbabilityInfo.h lib/Analysis/BranchProbabilityInfo.cpp

Andrew Trick atrick at apple.com
Thu Jun 23 22:24:32 PDT 2011


This is now identical to the original implementation whenever the frequency of the current loop header is START_FREQ (which it is always supposed to be). i.e. you have
Res = (N * START_FREQ) / D = (EdgeFreq(src, dst) * START_FREQ) / START_FREQ.

So it seems to be doing unnecessary computation and complicating the code for no benefit.

If the current loop head is not START_FREQ, then you have a bug somewhere else. It's better to leave the assert in place until you know what the problem is.

You also made this change, which may have fixed the original problem:
> uint32_t Numerator = START_FREQ - CProb ? START_FREQ - CProb : 1;

To me that implies a loop with zero probability of exiting. If so, please comment.

-Andy

On Jun 23, 2011, at 4:52 PM, Jakub Staszak wrote:

> Author: kuba
> Date: Thu Jun 23 18:52:11 2011
> New Revision: 133776
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=133776&view=rev
> Log:
> Calculate backedge probability correctly.
> 
> Modified:
>    llvm/trunk/include/llvm/Analysis/BlockFrequencyImpl.h
>    llvm/trunk/include/llvm/Analysis/BranchProbabilityInfo.h
>    llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp
> 
> Modified: llvm/trunk/include/llvm/Analysis/BlockFrequencyImpl.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BlockFrequencyImpl.h?rev=133776&r1=133775&r2=133776&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/BlockFrequencyImpl.h (original)
> +++ llvm/trunk/include/llvm/Analysis/BlockFrequencyImpl.h Thu Jun 23 18:52:11 2011
> @@ -133,6 +133,15 @@
>   }
> 
> 
> +  /// Return a probability of getting to the DST block through SRC->DST edge.
> +  ///
> +  BranchProbability getBackEdgeProbability(BlockT *Src, BlockT *Dst) const {
> +    uint32_t N = getEdgeFreq(Src, Dst);
> +    uint32_t D = getBlockFreq(Dst);
> +
> +    return BranchProbability(N, D);
> +  }
> +
>   /// isReachable - Returns if BB block is reachable from the entry.
>   ///
>   bool isReachable(BlockT *BB) {
> @@ -213,7 +222,9 @@
>       return;
> 
>     assert(START_FREQ >= CycleProb[BB]);
> -    divBlockFreq(BB, BranchProbability(START_FREQ - CycleProb[BB], START_FREQ));
> +    uint32_t CProb = CycleProb[BB];
> +    uint32_t Numerator = START_FREQ - CProb ? START_FREQ - CProb : 1;
> +    divBlockFreq(BB, BranchProbability(Numerator, START_FREQ));
>   }
> 
>   /// doLoop - Propagate block frequency down throught the loop.
> @@ -238,19 +249,17 @@
>       BlockT *Pred = *PI;
>       assert(Pred);
>       if (isReachable(Pred) && isBackedge(Pred, Head)) {
> -        BranchProbability Prob = BPI->getBackEdgeProbability(Pred, Head);
> +        BranchProbability Prob = getBackEdgeProbability(Pred, Head);
>         uint64_t N = Prob.getNumerator();
>         uint64_t D = Prob.getDenominator();
>         uint64_t Res = (N * START_FREQ) / D;
> 
> -        // CycleProb[Head] += getEdgeFreq(Pred, Head);
>         assert(Res <= UINT32_MAX);
>         CycleProb[Head] += (uint32_t) Res;
>       }
>     }
>   }
> 
> -
>   friend class BlockFrequency;
> 
>   void doFunction(FunctionT *fn, BlockProbInfoT *bpi) {
> 
> Modified: llvm/trunk/include/llvm/Analysis/BranchProbabilityInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/BranchProbabilityInfo.h?rev=133776&r1=133775&r2=133776&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/BranchProbabilityInfo.h (original)
> +++ llvm/trunk/include/llvm/Analysis/BranchProbabilityInfo.h Thu Jun 23 18:52:11 2011
> @@ -39,9 +39,6 @@
>   // Get sum of the block successors' weights.
>   uint32_t getSumForBlock(BasicBlock *BB) const;
> 
> -  // Get sum of the edge weights going to the BB block.
> -  uint32_t getBackSumForBlock(BasicBlock *BB) const;
> -
> public:
>   static char ID;
> 
> @@ -74,13 +71,6 @@
>   // only iff SRC block has only one successor.
>   BranchProbability getEdgeProbability(BasicBlock *Src, BasicBlock *Dst) const;
> 
> -  // Return a probability of getting to the DST block through SRC->DST edge.
> -  // Returned value is a fraction between 0 (0% probability) and
> -  // 1 (100% probability), however the value is never equal to 0, and can be 1
> -  // only iff DST block has only one predecesor.
> -  BranchProbability getBackEdgeProbability(BasicBlock *Src,
> -                                           BasicBlock *Dst) const;
> -
>   // Print value between 0 (0% probability) and 1 (100% probability),
>   // however the value is never equal to 0, and can be 1 only iff SRC block
>   // has only one successor.
> 
> Modified: llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp?rev=133776&r1=133775&r2=133776&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp (original)
> +++ llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp Thu Jun 23 18:52:11 2011
> @@ -279,21 +279,6 @@
>   return Sum;
> }
> 
> -uint32_t BranchProbabilityInfo::getBackSumForBlock(BasicBlock *BB) const {
> -  uint32_t Sum = 0;
> -
> -  for (pred_iterator I = pred_begin(BB), E = pred_end(BB); I != E; ++I) {
> -    BasicBlock *Pred = *I;
> -    uint32_t Weight = getEdgeWeight(Pred, BB);
> -    uint32_t PrevSum = Sum;
> -
> -    Sum += Weight;
> -    assert(Sum > PrevSum); (void) PrevSum;
> -  }
> -
> -  return Sum;
> -}
> -
> bool BranchProbabilityInfo::isEdgeHot(BasicBlock *Src, BasicBlock *Dst) const {
>   // Hot probability is at least 4/5 = 80%
>   uint32_t Weight = getEdgeWeight(Src, Dst);
> @@ -360,15 +345,6 @@
>   return BranchProbability(N, D);
> }
> 
> -BranchProbability BranchProbabilityInfo::
> -getBackEdgeProbability(BasicBlock *Src, BasicBlock *Dst) const {
> -
> -  uint32_t N = getEdgeWeight(Src, Dst);
> -  uint32_t D = getBackSumForBlock(Dst);
> -
> -  return BranchProbability(N, D);
> -}
> -
> raw_ostream &
> BranchProbabilityInfo::printEdgeProbability(raw_ostream &OS, BasicBlock *Src,
>                                             BasicBlock *Dst) const {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list