diff --git a/lib/Transforms/Scalar/LoopUnroll.cpp b/lib/Transforms/Scalar/LoopUnroll.cpp index 02cc509cc2f..266afbbe9b3 100644 --- a/lib/Transforms/Scalar/LoopUnroll.cpp +++ b/lib/Transforms/Scalar/LoopUnroll.cpp @@ -210,16 +210,22 @@ bool LoopUnroll::visitLoop(Loop *L) { } // If there was more than one iteration, replace any uses of values computed - // in the loop with values computed during last iteration of the loop. - if (TripCount != 1) - for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) { - std::vector Users(I->use_begin(), I->use_end()); - for (unsigned i = 0, e = Users.size(); i != e; ++i) { - Instruction *UI = cast(Users[i]); - if (UI->getParent() != BB && UI->getParent() != NewBlock) - UI->replaceUsesOfWith(I, LastValueMap[I]); - } + // in the loop with values computed during the last iteration of the loop. + if (TripCount != 1) { + std::set Users; + for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) + Users.insert(I->use_begin(), I->use_end()); + + // We don't want to reprocess entries with PHI nodes in them. For this + // reason, we look at each operand of each user exactly once, performing the + // stubstitution exactly once. + for (std::set::iterator UI = Users.begin(), E = Users.end(); UI != E; + ++UI) { + Instruction *I = cast(*UI); + if (I->getParent() != BB && I->getParent() != NewBlock) + RemapInstruction(I, LastValueMap); } + } // Now that we cloned the block as many times as we needed, stitch the new // code into the original block and delete the temporary block.