diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index e97e0911c17..c8e86d8e9d5 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -119,7 +119,15 @@ namespace { } virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesCFG(); + // We split critical edges, so we change the CFG. However, we do update + // many analyses if they are around. + AU.addPreservedID(LoopSimplifyID); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addPreserved(); + AU.addRequiredID(LoopSimplifyID); AU.addRequired(); AU.addRequired(); @@ -440,25 +448,20 @@ void BasedUser::RewriteInstructionToUseNewBase(const SCEVHandle &NewBase, // code on all predecessor/successor paths. if (e != 1 && PN->getIncomingBlock(i)->getTerminator()->getNumSuccessors() > 1) { - TerminatorInst *PredTI = PN->getIncomingBlock(i)->getTerminator(); - for (unsigned Succ = 0; ; ++Succ) { - assert(Succ != PredTI->getNumSuccessors() &&"Didn't find successor?"); - if (PredTI->getSuccessor(Succ) == PN->getParent()) { - // First step, split the critical edge. - SplitCriticalEdge(PredTI, Succ, P); + + // First step, split the critical edge. + SplitCriticalEdge(PN->getIncomingBlock(i), PN->getParent(), P); - // Next step: move the basic block. In particular, if the PHI node - // is outside of the loop, and PredTI is in the loop, we want to - // move the block to be immediately before the PHI block, not - // immediately after PredTI. - if (L->contains(PredTI->getParent()) && - !L->contains(PN->getParent())) { - BasicBlock *NewBB = PN->getIncomingBlock(i); - NewBB->moveBefore(PN->getParent()); - } - break; - } + // Next step: move the basic block. In particular, if the PHI node + // is outside of the loop, and PredTI is in the loop, we want to + // move the block to be immediately before the PHI block, not + // immediately after PredTI. + if (L->contains(PN->getIncomingBlock(i)) && + !L->contains(PN->getParent())) { + BasicBlock *NewBB = PN->getIncomingBlock(i); + NewBB->moveBefore(PN->getParent()); } + break; } Value *&Code = InsertedCode[PN->getIncomingBlock(i)];