mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-19 23:29:20 +00:00
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
This commit is contained in:
parent
b083af6448
commit
3d2aa47bd3
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user