diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-04-18 17:32:39 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-04-18 17:32:39 +0000 |
| commit | 230bcb6b353a0d565fcfff3406f1e6f056afa17c (patch) | |
| tree | 51b2de367d4612e3e2786ae88532365e5915aefa /llvm | |
| parent | 3796974563cd60ba64c36d2b4a78bcc2432e49df (diff) | |
| download | bcm5719-llvm-230bcb6b353a0d565fcfff3406f1e6f056afa17c.tar.gz bcm5719-llvm-230bcb6b353a0d565fcfff3406f1e6f056afa17c.zip | |
Be much more careful about how we update instructions outside of the loop
using instructions inside of the loop. This should fix the MishaTest failure
from last night.
llvm-svn: 13038
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnroll.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopUnroll.cpp b/llvm/lib/Transforms/Scalar/LoopUnroll.cpp index 02cc509cc2f..266afbbe9b3 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnroll.cpp +++ b/llvm/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<User*> Users(I->use_begin(), I->use_end()); - for (unsigned i = 0, e = Users.size(); i != e; ++i) { - Instruction *UI = cast<Instruction>(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<User*> 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<User*>::iterator UI = Users.begin(), E = Users.end(); UI != E; + ++UI) { + Instruction *I = cast<Instruction>(*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. |

