diff options
| author | Andrew Trick <atrick@apple.com> | 2011-09-26 23:11:04 +0000 | 
|---|---|---|
| committer | Andrew Trick <atrick@apple.com> | 2011-09-26 23:11:04 +0000 | 
| commit | 784729d4082f28de7b6a4b5e1a820ca567c22d82 (patch) | |
| tree | 9595ffa85c7afce55159e30088a69602f5b6bf5f /llvm/lib/Transforms | |
| parent | 287d6ef088e1f111fa010e71f58c1916d54b2cbb (diff) | |
| download | bcm5719-llvm-784729d4082f28de7b6a4b5e1a820ca567c22d82.tar.gz bcm5719-llvm-784729d4082f28de7b6a4b5e1a820ca567c22d82.zip | |
LSR cost metric minor fix and verification.
The minor bug heuristic was noticed by inspection. I added the
isLoser/isValid helpers because they will become more
important with subsequent checkins.
llvm-svn: 140580
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 29 | 
1 files changed, 26 insertions, 3 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 33858ad03fd..1e5b56bc4e2 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -670,6 +670,21 @@ public:    void Loose(); +#ifndef NDEBUG +  // Once any of the metrics loses, they must all remain losers. +  bool isValid() { +    return ((NumRegs | AddRecCost | NumIVMuls | NumBaseAdds +             | ImmCost | SetupCost) != ~0u) +      || ((NumRegs & AddRecCost & NumIVMuls & NumBaseAdds +           & ImmCost & SetupCost) == ~0u); +  } +#endif + +  bool isLoser() { +    assert(isValid() && "invalid cost"); +    return NumRegs == ~0u; +  } +    void RateFormula(const Formula &F,                     SmallPtrSet<const SCEV *, 16> &Regs,                     const DenseSet<const SCEV *> &VisitedRegs, @@ -710,19 +725,22 @@ void Cost::RateRegister(const SCEV *Reg,               (!AR->getLoop()->contains(L) &&                DT.dominates(L->getHeader(), AR->getLoop()->getHeader()))) {        for (BasicBlock::iterator I = AR->getLoop()->getHeader()->begin(); -           PHINode *PN = dyn_cast<PHINode>(I); ++I) +           PHINode *PN = dyn_cast<PHINode>(I); ++I) {          if (SE.isSCEVable(PN->getType()) &&              (SE.getEffectiveSCEVType(PN->getType()) ==               SE.getEffectiveSCEVType(AR->getType())) &&              SE.getSCEV(PN) == AR)            return; - +      }        // If this isn't one of the addrecs that the loop already has, it        // would require a costly new phi and add. TODO: This isn't        // precisely modeled right now.        ++NumBaseAdds; -      if (!Regs.count(AR->getStart())) +      if (!Regs.count(AR->getStart())) {          RateRegister(AR->getStart(), Regs, L, SE, DT); +        if (isLoser()) +          return; +      }      }      // Add the step value register, if it needs one. @@ -769,6 +787,8 @@ void Cost::RateFormula(const Formula &F,        return;      }      RatePrimaryRegister(ScaledReg, Regs, L, SE, DT); +    if (isLoser()) +      return;    }    for (SmallVectorImpl<const SCEV *>::const_iterator I = F.BaseRegs.begin(),         E = F.BaseRegs.end(); I != E; ++I) { @@ -778,6 +798,8 @@ void Cost::RateFormula(const Formula &F,        return;      }      RatePrimaryRegister(BaseReg, Regs, L, SE, DT); +    if (isLoser()) +      return;    }    // Determine how many (unfolded) adds we'll need inside the loop. @@ -795,6 +817,7 @@ void Cost::RateFormula(const Formula &F,      else if (Offset != 0)        ImmCost += APInt(64, Offset, true).getMinSignedBits();    } +  assert(isValid() && "invalid cost");  }  /// Loose - Set this cost to a losing value. | 

