PR 16899: Do not modify the basic block using the iterator, but keep the
authorJoerg Sonnenberger <joerg@bec.de>
Sat, 17 Aug 2013 11:04:47 +0000 (11:04 +0000)
committerJoerg Sonnenberger <joerg@bec.de>
Sat, 17 Aug 2013 11:04:47 +0000 (11:04 +0000)
next value. This avoids crashes due to invalidation.

Patch by Joey Gouly.

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

lib/Transforms/Vectorize/SLPVectorizer.cpp

index 506346d35833efa7190bae2afffb2ccafa0e07d5..ee9c5f2de7d5c76294817db07b6e84bc011bbe78 100644 (file)
@@ -1895,12 +1895,14 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
   if (Incoming.size() > 1)
     Changed |= tryToVectorizeList(Incoming, R);
 
-  for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; ++it) {
-    if (isa<DbgInfoIntrinsic>(it))
+  llvm::Instruction *I;
+  for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e;) {
+    I = it++;
+    if (isa<DbgInfoIntrinsic>(I))
       continue;
 
     // Try to vectorize reductions that use PHINodes.
-    if (PHINode *P = dyn_cast<PHINode>(it)) {
+    if (PHINode *P = dyn_cast<PHINode>(I)) {
       // Check that the PHI is a reduction PHI.
       if (P->getNumIncomingValues() != 2)
         return Changed;
@@ -1922,7 +1924,7 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) {
     }
 
     // Try to vectorize trees that start at compare instructions.
-    if (CmpInst *CI = dyn_cast<CmpInst>(it)) {
+    if (CmpInst *CI = dyn_cast<CmpInst>(I)) {
       if (tryToVectorizePair(CI->getOperand(0), CI->getOperand(1), R)) {
         Changed |= true;
         continue;