summaryrefslogtreecommitdiff
path: root/lib/Transforms/Utils/LCSSA.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2006-06-12 07:10:16 +0000
committerOwen Anderson <resistor@mac.com>2006-06-12 07:10:16 +0000
commit3d2aa47bd3a9e2ea5fdcf1690fa280a5199f4d81 (patch)
treedbd5c3a7af5b8850ab7948886bbf9b6bf8615105 /lib/Transforms/Utils/LCSSA.cpp
parentb083af644892fe76b74509096c47e86af4a9b651 (diff)
downloadllvm-3d2aa47bd3a9e2ea5fdcf1690fa280a5199f4d81.tar.gz
llvm-3d2aa47bd3a9e2ea5fdcf1690fa280a5199f4d81.tar.bz2
llvm-3d2aa47bd3a9e2ea5fdcf1690fa280a5199f4d81.tar.xz
Fix for 2006-06-26-MultipleExitsSingleBlock.
If a single exit block has multiple predecessors within the loop, it will appear in the exit blocks list more than once. LCSSA needs to take that into account so that it doesn't double process that exit block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28750 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r--lib/Transforms/Utils/LCSSA.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp
index ed02c97743..ac540c9aaa 100644
--- a/lib/Transforms/Utils/LCSSA.cpp
+++ b/lib/Transforms/Utils/LCSSA.cpp
@@ -155,13 +155,16 @@ void LCSSA::processInstruction(Instruction* Instr,
std::vector<PHINode*> workList;
for (std::vector<BasicBlock*>::const_iterator BBI = exitBlocks.begin(),
- BBE = exitBlocks.end(); BBI != BBE; ++BBI)
- if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) {
- PHINode *phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
+ BBE = exitBlocks.end(); BBI != BBE; ++BBI) {
+ Instruction*& phi = Phis[*BBI];
+ if (phi == 0 &&
+ DT->getNode(Instr->getParent())->dominates(DT->getNode(*BBI))) {
+ phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
(*BBI)->begin());
- workList.push_back(phi);
+ workList.push_back(cast<PHINode>(phi));
Phis[*BBI] = phi;
}
+ }
// Phi nodes that need to have their incoming values filled.
std::vector<PHINode*> needIncomingValues;