diff options
Diffstat (limited to 'lib/Transforms/Scalar/IndVarSimplify.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 155 | 
1 files changed, 98 insertions, 57 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 0fb67982a3db..09d569a097dd 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -73,6 +73,7 @@ namespace {      LoopInfo        *LI;      ScalarEvolution *SE;      DominatorTree   *DT; +    SmallVector<WeakVH, 16> DeadInsts;      bool Changed;    public: @@ -98,6 +99,7 @@ namespace {      }    private: +    bool isValidRewrite(Value *FromVal, Value *ToVal);      void EliminateIVComparisons();      void EliminateIVRemainders(); @@ -134,6 +136,53 @@ Pass *llvm::createIndVarSimplifyPass() {    return new IndVarSimplify();  } +/// isValidRewrite - Return true if the SCEV expansion generated by the +/// rewriter can replace the original value. SCEV guarantees that it +/// produces the same value, but the way it is produced may be illegal IR. +/// Ideally, this function will only be called for verification. +bool IndVarSimplify::isValidRewrite(Value *FromVal, Value *ToVal) { +  // If an SCEV expression subsumed multiple pointers, its expansion could +  // reassociate the GEP changing the base pointer. This is illegal because the +  // final address produced by a GEP chain must be inbounds relative to its +  // underlying object. Otherwise basic alias analysis, among other things, +  // could fail in a dangerous way. Ultimately, SCEV will be improved to avoid +  // producing an expression involving multiple pointers. Until then, we must +  // bail out here. +  // +  // Retrieve the pointer operand of the GEP. Don't use GetUnderlyingObject +  // because it understands lcssa phis while SCEV does not. +  Value *FromPtr = FromVal; +  Value *ToPtr = ToVal; +  if (GEPOperator *GEP = dyn_cast<GEPOperator>(FromVal)) { +    FromPtr = GEP->getPointerOperand(); +  } +  if (GEPOperator *GEP = dyn_cast<GEPOperator>(ToVal)) { +    ToPtr = GEP->getPointerOperand(); +  } +  if (FromPtr != FromVal || ToPtr != ToVal) { +    // Quickly check the common case +    if (FromPtr == ToPtr) +      return true; + +    // SCEV may have rewritten an expression that produces the GEP's pointer +    // operand. That's ok as long as the pointer operand has the same base +    // pointer. Unlike GetUnderlyingObject(), getPointerBase() will find the +    // base of a recurrence. This handles the case in which SCEV expansion +    // converts a pointer type recurrence into a nonrecurrent pointer base +    // indexed by an integer recurrence. +    const SCEV *FromBase = SE->getPointerBase(SE->getSCEV(FromPtr)); +    const SCEV *ToBase = SE->getPointerBase(SE->getSCEV(ToPtr)); +    if (FromBase == ToBase) +      return true; + +    DEBUG(dbgs() << "INDVARS: GEP rewrite bail out " +          << *FromBase << " != " << *ToBase << "\n"); + +    return false; +  } +  return true; +} +  /// LinearFunctionTestReplace - This method rewrites the exit condition of the  /// loop to be a canonical != comparison against the incremented loop induction  /// variable.  This pass is able to rewrite the exit tests of any loop where the @@ -226,7 +275,7 @@ ICmpInst *IndVarSimplify::LinearFunctionTestReplace(Loop *L,    // update the branch to use the new comparison; in the common case this    // will make old comparison dead.    BI->setCondition(Cond); -  RecursivelyDeleteTriviallyDeadInstructions(OrigCond); +  DeadInsts.push_back(OrigCond);    ++NumLFTR;    Changed = true; @@ -304,14 +353,18 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {          if (!SE->isLoopInvariant(ExitValue, L))            continue; -        Changed = true; -        ++NumReplaced; -          Value *ExitVal = Rewriter.expandCodeFor(ExitValue, PN->getType(), Inst);          DEBUG(dbgs() << "INDVARS: RLEV: AfterLoopVal = " << *ExitVal << '\n'                       << "  LoopVal = " << *Inst << "\n"); +        if (!isValidRewrite(Inst, ExitVal)) { +          DeadInsts.push_back(ExitVal); +          continue; +        } +        Changed = true; +        ++NumReplaced; +          PN->setIncomingValue(i, ExitVal);          // If this instruction is dead now, delete it. @@ -366,8 +419,6 @@ void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) {  }  void IndVarSimplify::EliminateIVComparisons() { -  SmallVector<WeakVH, 16> DeadInsts; -    // Look for ICmp users.    for (IVUsers::iterator I = IU->begin(), E = IU->end(); I != E; ++I) {      IVStrideUse &UI = *I; @@ -399,18 +450,9 @@ void IndVarSimplify::EliminateIVComparisons() {      DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n');      DeadInsts.push_back(ICmp);    } - -  // Now that we're done iterating through lists, clean up any instructions -  // which are now dead. -  while (!DeadInsts.empty()) -    if (Instruction *Inst = -        dyn_cast_or_null<Instruction>(&*DeadInsts.pop_back_val())) -      RecursivelyDeleteTriviallyDeadInstructions(Inst);  }  void IndVarSimplify::EliminateIVRemainders() { -  SmallVector<WeakVH, 16> DeadInsts; -    // Look for SRem and URem users.    for (IVUsers::iterator I = IU->begin(), E = IU->end(); I != E; ++I) {      IVStrideUse &UI = *I; @@ -466,13 +508,6 @@ void IndVarSimplify::EliminateIVRemainders() {      DEBUG(dbgs() << "INDVARS: Simplified rem: " << *Rem << '\n');      DeadInsts.push_back(Rem);    } - -  // Now that we're done iterating through lists, clean up any instructions -  // which are now dead. -  while (!DeadInsts.empty()) -    if (Instruction *Inst = -          dyn_cast_or_null<Instruction>(&*DeadInsts.pop_back_val())) -      RecursivelyDeleteTriviallyDeadInstructions(Inst);  }  bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) { @@ -491,6 +526,7 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {    LI = &getAnalysis<LoopInfo>();    SE = &getAnalysis<ScalarEvolution>();    DT = &getAnalysis<DominatorTree>(); +  DeadInsts.clear();    Changed = false;    // If there are any floating-point recurrences, attempt to @@ -589,9 +625,21 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {                                            ExitingBlock, BI, Rewriter);    } -  // Rewrite IV-derived expressions. Clears the rewriter cache. +  // Rewrite IV-derived expressions.    RewriteIVExpressions(L, Rewriter); +  // Clear the rewriter cache, because values that are in the rewriter's cache +  // can be deleted in the loop below, causing the AssertingVH in the cache to +  // trigger. +  Rewriter.clear(); + +  // Now that we're done iterating through lists, clean up any instructions +  // which are now dead. +  while (!DeadInsts.empty()) +    if (Instruction *Inst = +          dyn_cast_or_null<Instruction>(&*DeadInsts.pop_back_val())) +      RecursivelyDeleteTriviallyDeadInstructions(Inst); +    // The Rewriter may not be used from this point on.    // Loop-invariant instructions in the preheader that aren't used in the @@ -632,7 +680,7 @@ static bool isSafe(const SCEV *S, const Loop *L, ScalarEvolution *SE) {        if (!isSafe(*I, L, SE)) return false;      return true;    } -   +    // A cast is safe if its operand is.    if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(S))      return isSafe(C->getOperand(), L, SE); @@ -651,8 +699,6 @@ static bool isSafe(const SCEV *S, const Loop *L, ScalarEvolution *SE) {  }  void IndVarSimplify::RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter) { -  SmallVector<WeakVH, 16> DeadInsts; -    // Rewrite all induction variable expressions in terms of the canonical    // induction variable.    // @@ -705,6 +751,13 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter) {      // Now expand it into actual Instructions and patch it into place.      Value *NewVal = Rewriter.expandCodeFor(AR, UseTy, InsertPt); +    DEBUG(dbgs() << "INDVARS: Rewrote IV '" << *AR << "' " << *Op << '\n' +                 << "   into = " << *NewVal << "\n"); + +    if (!isValidRewrite(Op, NewVal)) { +      DeadInsts.push_back(NewVal); +      continue; +    }      // Inform ScalarEvolution that this value is changing. The change doesn't      // affect its value, but it does potentially affect which use lists the      // value will be on after the replacement, which affects ScalarEvolution's @@ -717,25 +770,13 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, SCEVExpander &Rewriter) {        NewVal->takeName(Op);      User->replaceUsesOfWith(Op, NewVal);      UI->setOperandValToReplace(NewVal); -    DEBUG(dbgs() << "INDVARS: Rewrote IV '" << *AR << "' " << *Op << '\n' -                 << "   into = " << *NewVal << "\n"); +      ++NumRemoved;      Changed = true;      // The old value may be dead now.      DeadInsts.push_back(Op);    } - -  // Clear the rewriter cache, because values that are in the rewriter's cache -  // can be deleted in the loop below, causing the AssertingVH in the cache to -  // trigger. -  Rewriter.clear(); -  // Now that we're done iterating through lists, clean up any instructions -  // which are now dead. -  while (!DeadInsts.empty()) -    if (Instruction *Inst = -          dyn_cast_or_null<Instruction>(&*DeadInsts.pop_back_val())) -      RecursivelyDeleteTriviallyDeadInstructions(Inst);  }  /// If there's a single exit block, sink any loop-invariant values that @@ -859,7 +900,7 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {    BinaryOperator *Incr =      dyn_cast<BinaryOperator>(PN->getIncomingValue(BackEdge));    if (Incr == 0 || Incr->getOpcode() != Instruction::FAdd) return; -   +    // If this is not an add of the PHI with a constantfp, or if the constant fp    // is not an integer, bail out.    ConstantFP *IncValueVal = dyn_cast<ConstantFP>(Incr->getOperand(1)); @@ -884,7 +925,7 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {    if (Compare == 0 || !Compare->hasOneUse() ||        !isa<BranchInst>(Compare->use_back()))      return; -   +    BranchInst *TheBr = cast<BranchInst>(Compare->use_back());    // We need to verify that the branch actually controls the iteration count @@ -896,8 +937,8 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {        (L->contains(TheBr->getSuccessor(0)) &&         L->contains(TheBr->getSuccessor(1))))      return; -   -   + +    // If it isn't a comparison with an integer-as-fp (the exit value), we can't    // transform it.    ConstantFP *ExitValueVal = dyn_cast<ConstantFP>(Compare->getOperand(1)); @@ -905,7 +946,7 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {    if (ExitValueVal == 0 ||        !ConvertToSInt(ExitValueVal->getValueAPF(), ExitValue))      return; -   +    // Find new predicate for integer comparison.    CmpInst::Predicate NewPred = CmpInst::BAD_ICMP_PREDICATE;    switch (Compare->getPredicate()) { @@ -923,13 +964,13 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {    case CmpInst::FCMP_OLE:    case CmpInst::FCMP_ULE: NewPred = CmpInst::ICMP_SLE; break;    } -   +    // We convert the floating point induction variable to a signed i32 value if    // we can.  This is only safe if the comparison will not overflow in a way    // that won't be trapped by the integer equivalent operations.  Check for this    // now.    // TODO: We could use i64 if it is native and the range requires it. -   +    // The start/stride/exit values must all fit in signed i32.    if (!isInt<32>(InitValue) || !isInt<32>(IncValue) || !isInt<32>(ExitValue))      return; @@ -945,59 +986,59 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {      if (InitValue >= ExitValue ||          NewPred == CmpInst::ICMP_SGT || NewPred == CmpInst::ICMP_SGE)        return; -     +      uint32_t Range = uint32_t(ExitValue-InitValue);      if (NewPred == CmpInst::ICMP_SLE) {        // Normalize SLE -> SLT, check for infinite loop.        if (++Range == 0) return;  // Range overflows.      } -     +      unsigned Leftover = Range % uint32_t(IncValue); -     +      // If this is an equality comparison, we require that the strided value      // exactly land on the exit value, otherwise the IV condition will wrap      // around and do things the fp IV wouldn't.      if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&          Leftover != 0)        return; -     +      // If the stride would wrap around the i32 before exiting, we can't      // transform the IV.      if (Leftover != 0 && int32_t(ExitValue+IncValue) < ExitValue)        return; -     +    } else {      // If we have a negative stride, we require the init to be greater than the      // exit value and an equality or greater than comparison.      if (InitValue >= ExitValue ||          NewPred == CmpInst::ICMP_SLT || NewPred == CmpInst::ICMP_SLE)        return; -     +      uint32_t Range = uint32_t(InitValue-ExitValue);      if (NewPred == CmpInst::ICMP_SGE) {        // Normalize SGE -> SGT, check for infinite loop.        if (++Range == 0) return;  // Range overflows.      } -     +      unsigned Leftover = Range % uint32_t(-IncValue); -     +      // If this is an equality comparison, we require that the strided value      // exactly land on the exit value, otherwise the IV condition will wrap      // around and do things the fp IV wouldn't.      if ((NewPred == CmpInst::ICMP_EQ || NewPred == CmpInst::ICMP_NE) &&          Leftover != 0)        return; -     +      // If the stride would wrap around the i32 before exiting, we can't      // transform the IV.      if (Leftover != 0 && int32_t(ExitValue+IncValue) > ExitValue)        return;    } -   +    const IntegerType *Int32Ty = Type::getInt32Ty(PN->getContext());    // Insert new integer induction variable. -  PHINode *NewPHI = PHINode::Create(Int32Ty, PN->getName()+".int", PN); +  PHINode *NewPHI = PHINode::Create(Int32Ty, 2, PN->getName()+".int", PN);    NewPHI->addIncoming(ConstantInt::get(Int32Ty, InitValue),                        PN->getIncomingBlock(IncomingEdge));  | 
