Fix a regression from last night, which caused this pass to create invalid
authorChris Lattner <sabre@nondot.org>
Mon, 12 Sep 2005 17:11:27 +0000 (17:11 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 12 Sep 2005 17:11:27 +0000 (17:11 +0000)
code for IV uses outside of loops that are not dominated by the latch block.
We should only convert these uses to use the post-inc value if they ARE
dominated by the latch block.

Also use a new LoopInfo method to simplify some code.

This fixes Transforms/LoopStrengthReduce/2005-09-12-UsesOutOutsideOfLoop.ll

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23318 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 29043a152cfe96902c80f426bb1a6f87d513748e..1a6ce62102f5052fcc32f2437286647396968de9 100644 (file)
@@ -353,7 +353,11 @@ bool LoopStrengthReduce::AddUsersIfInteresting(Instruction *I, Loop *L,
       // Okay, we found a user that we cannot reduce.  Analyze the instruction
       // and decide what to do with it.  If we are a use inside of the loop, use
       // the value before incrementation, otherwise use it after incrementation.
-      if (L->contains(User->getParent())) {
+      if (L->contains(User->getParent()) ||
+          // Alternatively, if we are a use outside of the loop, but is not
+          // dominated by the latch block, we have to use the preincremented
+          // value.
+          !DS->dominates(L->getLoopLatch(), User->getParent())) {
         IVUsesByStride[Stride].addUser(Start, User, I);
       } else {
         // The value used will be incremented by the stride more than we are
@@ -784,13 +788,7 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEVHandle &Stride,
   Instruction *PreInsertPt = Preheader->getTerminator();
   Instruction *PhiInsertBefore = L->getHeader()->begin();
   
-  assert(isa<PHINode>(PhiInsertBefore) &&
-         "How could this loop have IV's without any phis?");
-  PHINode *SomeLoopPHI = cast<PHINode>(PhiInsertBefore);
-  assert(SomeLoopPHI->getNumIncomingValues() == 2 &&
-         "This loop isn't canonicalized right");
-  BasicBlock *LatchBlock =
-   SomeLoopPHI->getIncomingBlock(SomeLoopPHI->getIncomingBlock(0) == Preheader);
+  BasicBlock *LatchBlock = L->getLoopLatch();
   
   // Create a new Phi for this base, and stick it in the loop header.
   const Type *ReplacedTy = CommonExprs->getType();