aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Utils/LCSSA.cpp29
1 files changed, 13 insertions, 16 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp
index 6829921..a5411d4 100644
--- a/lib/Transforms/Utils/LCSSA.cpp
+++ b/lib/Transforms/Utils/LCSSA.cpp
@@ -50,7 +50,7 @@ namespace {
LoopInfo *LI; // Loop information
- DominatorTree *DT; // Dominator Tree for the current Loop...
+ DominatorTree *DT; // Dominator Tree for the current Function...
DominanceFrontier *DF; // Current Dominance Frontier
std::vector<BasicBlock*> *LoopBlocks;
@@ -149,7 +149,8 @@ void LCSSA::processInstruction(Instruction* Instr,
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(), "lcssa", (*BBI)->begin());
+ PHINode *phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
+ (*BBI)->begin());
workList.push_back(phi);
Phis[*BBI] = phi;
}
@@ -174,12 +175,15 @@ void LCSSA::processInstruction(Instruction* Instr,
const DominanceFrontier::DomSetType &S = it->second;
for (DominanceFrontier::DomSetType::const_iterator P = S.begin(),
PE = S.end(); P != PE; ++P) {
- Instruction *&Phi = Phis[*P];
- if (Phi == 0) {
- // Still doesn't have operands...
- Phi = new PHINode(Instr->getType(), "lcssa", (*P)->begin());
+ if (DT->getNode(Instr->getParent())->dominates(DT->getNode(*P))) {
+ Instruction *&Phi = Phis[*P];
+ if (Phi == 0) {
+ // Still doesn't have operands...
+ Phi = new PHINode(Instr->getType(), Instr->getName()+".lcssa",
+ (*P)->begin());
- workList.push_back(cast<PHINode>(Phi));
+ workList.push_back(cast<PHINode>(Phi));
+ }
}
}
}
@@ -200,18 +204,11 @@ void LCSSA::processInstruction(Instruction* Instr,
for (Instruction::use_iterator UI = Instr->use_begin(), UE = Instr->use_end();
UI != UE; ++UI) {
Instruction* use = cast<Instruction>(*UI);
- // Don't need to update uses within the loop body, and we don't want to
- // overwrite the Phi nodes that we inserted into the exit blocks either.
- if (!inLoopBlocks(use->getParent()) &&
- !(std::binary_search(exitBlocks.begin(), exitBlocks.end(),
- use->getParent()) && isa<PHINode>(use)))
+ // Don't need to update uses within the loop body.
+ if (!inLoopBlocks(use->getParent()))
Uses.push_back(use);
}
- // Deliberately remove the initial instruction from Phis set. It would mess
- // up use-replacement.
- Phis.erase(Instr->getParent());
-
for (std::vector<Instruction*>::iterator II = Uses.begin(), IE = Uses.end();
II != IE; ++II) {
if (PHINode* phi = dyn_cast<PHINode>(*II)) {