diff options
Diffstat (limited to 'contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp')
| -rw-r--r-- | contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp | 134 | 
1 files changed, 77 insertions, 57 deletions
diff --git a/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp index b255ce6dba51..04a6560262cb 100644 --- a/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/contrib/llvm/lib/Analysis/BranchProbabilityInfo.cpp @@ -115,14 +115,14 @@ bool BranchProbabilityInfo::calcUnreachableHeuristics(BasicBlock *BB) {      return false;    } -  SmallPtrSet<BasicBlock *, 4> UnreachableEdges; -  SmallPtrSet<BasicBlock *, 4> ReachableEdges; +  SmallVector<unsigned, 4> UnreachableEdges; +  SmallVector<unsigned, 4> ReachableEdges;    for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {      if (PostDominatedByUnreachable.count(*I)) -      UnreachableEdges.insert(*I); +      UnreachableEdges.push_back(I.getSuccessorIndex());      else -      ReachableEdges.insert(*I); +      ReachableEdges.push_back(I.getSuccessorIndex());    }    // If all successors are in the set of blocks post-dominated by unreachable, @@ -136,18 +136,19 @@ bool BranchProbabilityInfo::calcUnreachableHeuristics(BasicBlock *BB) {      return false;    uint32_t UnreachableWeight = -    std::max(UR_TAKEN_WEIGHT / UnreachableEdges.size(), MIN_WEIGHT); -  for (SmallPtrSet<BasicBlock *, 4>::iterator I = UnreachableEdges.begin(), -                                              E = UnreachableEdges.end(); +    std::max(UR_TAKEN_WEIGHT / (unsigned)UnreachableEdges.size(), MIN_WEIGHT); +  for (SmallVector<unsigned, 4>::iterator I = UnreachableEdges.begin(), +                                          E = UnreachableEdges.end();         I != E; ++I)      setEdgeWeight(BB, *I, UnreachableWeight);    if (ReachableEdges.empty())      return true;    uint32_t ReachableWeight = -    std::max(UR_NONTAKEN_WEIGHT / ReachableEdges.size(), NORMAL_WEIGHT); -  for (SmallPtrSet<BasicBlock *, 4>::iterator I = ReachableEdges.begin(), -                                              E = ReachableEdges.end(); +    std::max(UR_NONTAKEN_WEIGHT / (unsigned)ReachableEdges.size(), +             NORMAL_WEIGHT); +  for (SmallVector<unsigned, 4>::iterator I = ReachableEdges.begin(), +                                          E = ReachableEdges.end();         I != E; ++I)      setEdgeWeight(BB, *I, ReachableWeight); @@ -187,7 +188,7 @@ bool BranchProbabilityInfo::calcMetadataWeights(BasicBlock *BB) {    }    assert(Weights.size() == TI->getNumSuccessors() && "Checked above");    for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) -    setEdgeWeight(BB, TI->getSuccessor(i), Weights[i]); +    setEdgeWeight(BB, i, Weights[i]);    return true;  } @@ -211,19 +212,17 @@ bool BranchProbabilityInfo::calcPointerHeuristics(BasicBlock *BB) {    assert(CI->getOperand(1)->getType()->isPointerTy()); -  BasicBlock *Taken = BI->getSuccessor(0); -  BasicBlock *NonTaken = BI->getSuccessor(1); -    // p != 0   ->   isProb = true    // p == 0   ->   isProb = false    // p != q   ->   isProb = true    // p == q   ->   isProb = false; +  unsigned TakenIdx = 0, NonTakenIdx = 1;    bool isProb = CI->getPredicate() == ICmpInst::ICMP_NE;    if (!isProb) -    std::swap(Taken, NonTaken); +    std::swap(TakenIdx, NonTakenIdx); -  setEdgeWeight(BB, Taken, PH_TAKEN_WEIGHT); -  setEdgeWeight(BB, NonTaken, PH_NONTAKEN_WEIGHT); +  setEdgeWeight(BB, TakenIdx, PH_TAKEN_WEIGHT); +  setEdgeWeight(BB, NonTakenIdx, PH_NONTAKEN_WEIGHT);    return true;  } @@ -234,17 +233,17 @@ bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB) {    if (!L)      return false; -  SmallPtrSet<BasicBlock *, 8> BackEdges; -  SmallPtrSet<BasicBlock *, 8> ExitingEdges; -  SmallPtrSet<BasicBlock *, 8> InEdges; // Edges from header to the loop. +  SmallVector<unsigned, 8> BackEdges; +  SmallVector<unsigned, 8> ExitingEdges; +  SmallVector<unsigned, 8> InEdges; // Edges from header to the loop.    for (succ_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {      if (!L->contains(*I)) -      ExitingEdges.insert(*I); +      ExitingEdges.push_back(I.getSuccessorIndex());      else if (L->getHeader() == *I) -      BackEdges.insert(*I); +      BackEdges.push_back(I.getSuccessorIndex());      else -      InEdges.insert(*I); +      InEdges.push_back(I.getSuccessorIndex());    }    if (uint32_t numBackEdges = BackEdges.size()) { @@ -252,10 +251,9 @@ bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB) {      if (backWeight < NORMAL_WEIGHT)        backWeight = NORMAL_WEIGHT; -    for (SmallPtrSet<BasicBlock *, 8>::iterator EI = BackEdges.begin(), +    for (SmallVector<unsigned, 8>::iterator EI = BackEdges.begin(),           EE = BackEdges.end(); EI != EE; ++EI) { -      BasicBlock *Back = *EI; -      setEdgeWeight(BB, Back, backWeight); +      setEdgeWeight(BB, *EI, backWeight);      }    } @@ -264,10 +262,9 @@ bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB) {      if (inWeight < NORMAL_WEIGHT)        inWeight = NORMAL_WEIGHT; -    for (SmallPtrSet<BasicBlock *, 8>::iterator EI = InEdges.begin(), +    for (SmallVector<unsigned, 8>::iterator EI = InEdges.begin(),           EE = InEdges.end(); EI != EE; ++EI) { -      BasicBlock *Back = *EI; -      setEdgeWeight(BB, Back, inWeight); +      setEdgeWeight(BB, *EI, inWeight);      }    } @@ -276,10 +273,9 @@ bool BranchProbabilityInfo::calcLoopBranchHeuristics(BasicBlock *BB) {      if (exitWeight < MIN_WEIGHT)        exitWeight = MIN_WEIGHT; -    for (SmallPtrSet<BasicBlock *, 8>::iterator EI = ExitingEdges.begin(), +    for (SmallVector<unsigned, 8>::iterator EI = ExitingEdges.begin(),           EE = ExitingEdges.end(); EI != EE; ++EI) { -      BasicBlock *Exiting = *EI; -      setEdgeWeight(BB, Exiting, exitWeight); +      setEdgeWeight(BB, *EI, exitWeight);      }    } @@ -335,14 +331,13 @@ bool BranchProbabilityInfo::calcZeroHeuristics(BasicBlock *BB) {      return false;    } -  BasicBlock *Taken = BI->getSuccessor(0); -  BasicBlock *NonTaken = BI->getSuccessor(1); +  unsigned TakenIdx = 0, NonTakenIdx = 1;    if (!isProb) -    std::swap(Taken, NonTaken); +    std::swap(TakenIdx, NonTakenIdx); -  setEdgeWeight(BB, Taken, ZH_TAKEN_WEIGHT); -  setEdgeWeight(BB, NonTaken, ZH_NONTAKEN_WEIGHT); +  setEdgeWeight(BB, TakenIdx, ZH_TAKEN_WEIGHT); +  setEdgeWeight(BB, NonTakenIdx, ZH_NONTAKEN_WEIGHT);    return true;  } @@ -372,14 +367,13 @@ bool BranchProbabilityInfo::calcFloatingPointHeuristics(BasicBlock *BB) {      return false;    } -  BasicBlock *Taken = BI->getSuccessor(0); -  BasicBlock *NonTaken = BI->getSuccessor(1); +  unsigned TakenIdx = 0, NonTakenIdx = 1;    if (!isProb) -    std::swap(Taken, NonTaken); +    std::swap(TakenIdx, NonTakenIdx); -  setEdgeWeight(BB, Taken, FPH_TAKEN_WEIGHT); -  setEdgeWeight(BB, NonTaken, FPH_NONTAKEN_WEIGHT); +  setEdgeWeight(BB, TakenIdx, FPH_TAKEN_WEIGHT); +  setEdgeWeight(BB, NonTakenIdx, FPH_NONTAKEN_WEIGHT);    return true;  } @@ -389,11 +383,8 @@ bool BranchProbabilityInfo::calcInvokeHeuristics(BasicBlock *BB) {    if (!II)      return false; -  BasicBlock *Normal = II->getNormalDest(); -  BasicBlock *Unwind = II->getUnwindDest(); - -  setEdgeWeight(BB, Normal, IH_TAKEN_WEIGHT); -  setEdgeWeight(BB, Unwind, IH_NONTAKEN_WEIGHT); +  setEdgeWeight(BB, 0/*Index for Normal*/, IH_TAKEN_WEIGHT); +  setEdgeWeight(BB, 1/*Index for Unwind*/, IH_NONTAKEN_WEIGHT);    return true;  } @@ -450,8 +441,7 @@ uint32_t BranchProbabilityInfo::getSumForBlock(const BasicBlock *BB) const {    uint32_t Sum = 0;    for (succ_const_iterator I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { -    const BasicBlock *Succ = *I; -    uint32_t Weight = getEdgeWeight(BB, Succ); +    uint32_t Weight = getEdgeWeight(BB, I.getSuccessorIndex());      uint32_t PrevSum = Sum;      Sum += Weight; @@ -494,11 +484,13 @@ BasicBlock *BranchProbabilityInfo::getHotSucc(BasicBlock *BB) const {    return 0;  } -// Return edge's weight. If can't find it, return DEFAULT_WEIGHT value. +/// Get the raw edge weight for the edge. If can't find it, return +/// DEFAULT_WEIGHT value. Here an edge is specified using PredBlock and an index +/// to the successors.  uint32_t BranchProbabilityInfo:: -getEdgeWeight(const BasicBlock *Src, const BasicBlock *Dst) const { -  Edge E(Src, Dst); -  DenseMap<Edge, uint32_t>::const_iterator I = Weights.find(E); +getEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors) const { +  DenseMap<Edge, uint32_t>::const_iterator I = +      Weights.find(std::make_pair(Src, IndexInSuccessors));    if (I != Weights.end())      return I->second; @@ -506,15 +498,43 @@ getEdgeWeight(const BasicBlock *Src, const BasicBlock *Dst) const {    return DEFAULT_WEIGHT;  } +/// Get the raw edge weight calculated for the block pair. This returns the sum +/// of all raw edge weights from Src to Dst. +uint32_t BranchProbabilityInfo:: +getEdgeWeight(const BasicBlock *Src, const BasicBlock *Dst) const { +  uint32_t Weight = 0; +  DenseMap<Edge, uint32_t>::const_iterator MapI; +  for (succ_const_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I) +    if (*I == Dst) { +      MapI = Weights.find(std::make_pair(Src, I.getSuccessorIndex())); +      if (MapI != Weights.end()) +        Weight += MapI->second; +    } +  return (Weight == 0) ? DEFAULT_WEIGHT : Weight; +} + +/// Set the edge weight for a given edge specified by PredBlock and an index +/// to the successors.  void BranchProbabilityInfo:: -setEdgeWeight(const BasicBlock *Src, const BasicBlock *Dst, uint32_t Weight) { -  Weights[std::make_pair(Src, Dst)] = Weight; +setEdgeWeight(const BasicBlock *Src, unsigned IndexInSuccessors, +              uint32_t Weight) { +  Weights[std::make_pair(Src, IndexInSuccessors)] = Weight;    DEBUG(dbgs() << "set edge " << Src->getName() << " -> " -               << Dst->getName() << " weight to " << Weight -               << (isEdgeHot(Src, Dst) ? " [is HOT now]\n" : "\n")); +               << IndexInSuccessors << " successor weight to " +               << Weight << "\n");  } +/// Get an edge's probability, relative to other out-edges from Src. +BranchProbability BranchProbabilityInfo:: +getEdgeProbability(const BasicBlock *Src, unsigned IndexInSuccessors) const { +  uint32_t N = getEdgeWeight(Src, IndexInSuccessors); +  uint32_t D = getSumForBlock(Src); + +  return BranchProbability(N, D); +} +/// Get the probability of going from Src to Dst. It returns the sum of all +/// probabilities for edges from Src to Dst.  BranchProbability BranchProbabilityInfo::  getEdgeProbability(const BasicBlock *Src, const BasicBlock *Dst) const {  | 
