[llvm-commits] [llvm] r49106 - in /llvm/trunk: include/llvm/ADT/SmallVector.h lib/Transforms/Scalar/LoopIndexSplit.cpp

David Greene greened at obbligato.org
Wed Apr 2 11:24:46 PDT 2008


Author: greened
Date: Wed Apr  2 13:24:46 2008
New Revision: 49106

URL: http://llvm.org/viewvc/llvm-project?rev=49106&view=rev
Log:

Iterators folloring a SmallVector erased element are invalidated so
don't access cached iterators from after the erased element.

Re-apply 49056 with SmallVector support.

Modified:
    llvm/trunk/include/llvm/ADT/SmallVector.h
    llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp

Modified: llvm/trunk/include/llvm/ADT/SmallVector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SmallVector.h?rev=49106&r1=49105&r2=49106&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/SmallVector.h (original)
+++ llvm/trunk/include/llvm/ADT/SmallVector.h Wed Apr  2 13:24:46 2008
@@ -208,19 +208,23 @@
     construct_range(Begin, End, Elt);
   }
   
-  void erase(iterator I) {
+  iterator erase(iterator I) {
+    iterator N = I;
     // Shift all elts down one.
     std::copy(I+1, End, I);
     // Drop the last elt.
     pop_back();
+    return(N);
   }
   
-  void erase(iterator S, iterator E) {
+  iterator erase(iterator S, iterator E) {
+    iterator N = S;
     // Shift all elts down.
     iterator I = std::copy(E, End, S);
     // Drop the last elts.
     destroy_range(I, End);
     End = I;
+    return(N);
   }
   
   iterator insert(iterator I, const T &Elt) {

Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=49106&r1=49105&r2=49106&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Wed Apr  2 13:24:46 2008
@@ -232,8 +232,8 @@
     return false;
 
   // First see if it is possible to eliminate loop itself or not.
-  for (SmallVector<SplitInfo, 4>::iterator SI = SplitData.begin(),
-         E = SplitData.end(); SI != E;) {
+  for (SmallVector<SplitInfo, 4>::iterator SI = SplitData.begin();
+       SI != SplitData.end();) {
     SplitInfo &SD = *SI;
     ICmpInst *CI = dyn_cast<ICmpInst>(SD.SplitCondition);
     if (SD.SplitCondition->getOpcode() == Instruction::And) {
@@ -244,8 +244,7 @@
         return Changed;
       } else {
         SmallVector<SplitInfo, 4>::iterator Delete_SI = SI;
-        ++SI;
-        SplitData.erase(Delete_SI);
+        SI = SplitData.erase(Delete_SI);
       }
     }
     else if (CI && CI->getPredicate() == ICmpInst::ICMP_EQ) {
@@ -256,8 +255,7 @@
         return Changed;
       } else {
         SmallVector<SplitInfo, 4>::iterator Delete_SI = SI;
-        ++SI;
-        SplitData.erase(Delete_SI);
+        SI = SplitData.erase(Delete_SI);
       }
     } else
       ++SI;





More information about the llvm-commits mailing list