Fix
authorDevang Patel <dpatel@apple.com>
Mon, 23 Apr 2007 22:42:03 +0000 (22:42 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 23 Apr 2007 22:42:03 +0000 (22:42 +0000)
http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070423/048333.html

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

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 38cfd91fe1b5564b78b356c3812c357b8d8adb29..6bece9cfb7ebcb3437b1765dd29678da86d6cf97 100644 (file)
@@ -416,12 +416,16 @@ bool LoopStrengthReduce::AddUsersIfInteresting(Instruction *I, Loop *L,
   if (!getSCEVStartAndStride(ISE, L, Start, Stride))
     return false;  // Non-reducible symbolic expression, bail out.
 
-  for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E;) {
-    Instruction *User = cast<Instruction>(*UI);
+  std::vector<Instruction *> IUsers;
+  // Collect all I uses now because IVUseShouldUsePostIncValue may 
+  // invalidate use_iterator.
+  for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI)
+    IUsers.push_back(cast<Instruction>(*UI));
 
-    // Increment iterator now because IVUseShouldUsePostIncValue may remove 
-    // User from the list of I users.
-    ++UI;
+  for (unsigned iused_index = 0, iused_size = IUsers.size(); 
+       iused_index != iused_size; ++iused_index) {
+
+    Instruction *User = IUsers[iused_index];
 
     // Do not infinitely recurse on PHI nodes.
     if (isa<PHINode>(User) && Processed.count(User))