Be more careful modifying the use_list while also iterating through it.
authorNick Lewycky <nicholas@mxc.ca>
Sun, 27 Jan 2008 18:35:00 +0000 (18:35 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sun, 27 Jan 2008 18:35:00 +0000 (18:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46417 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopUnroll.cpp
test/Transforms/LoopUnroll/2007-11-05-Crash.ll

index ff2168ac8de50cfbe5e442ca89e16469d6414ee7..b514156a1afcd4724c116f0c3483098fe0bf63e8 100644 (file)
@@ -365,8 +365,9 @@ bool LoopUnroll::unrollLoop(Loop *L, unsigned Count, unsigned Threshold) {
       // be updated specially after unrolling all the way.
       if (*BB != LatchBlock)
         for (Value::use_iterator UI = (*BB)->use_begin(), UE = (*BB)->use_end();
-             UI != UE; ++UI) {
+             UI != UE;) {
           Instruction *UseInst = cast<Instruction>(*UI);
+          ++UI;
           if (isa<PHINode>(UseInst) && !L->contains(UseInst->getParent())) {
             PHINode *phi = cast<PHINode>(UseInst);
             Value *Incoming = phi->getIncomingValueForBlock(*BB);
index a5e13d5a26aec70f215ceb25b98a71fd80abb8a2..a46c09e3bde8c655c329edbb2dddb58ddc6f7c8c 100644 (file)
@@ -1,5 +1,7 @@
 ; RUN: llvm-as < %s | opt -disable-output -loop-unroll
 ; PR1770
+; PR1947
+
        %struct.cl_engine = type { i32, i16, i32, i8**, i8**, i8*, i8*, i8*, i8*, i8*, i8*, i8* }
        %struct.cl_limits = type { i32, i32, i32, i32, i16, i64 }
        %struct.cli_ac_alt = type { i8, i8*, i16, i16, %struct.cli_ac_alt* }