mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Fix LCSSA to avoid emitting a PHI node for the unwind destination of
an invoke instruction, since the value isn't really live across that edge. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74242 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -149,7 +149,16 @@ void LCSSA::ProcessInstruction(Instruction *Instr,
|
||||
// Keep track of the blocks that have the value available already.
|
||||
DenseMap<DomTreeNode*, Value*> Phis;
|
||||
|
||||
DomTreeNode *InstrNode = DT->getNode(Instr->getParent());
|
||||
BasicBlock *DomBB = Instr->getParent();
|
||||
|
||||
// Invoke instructions are special in that their result value is not available
|
||||
// along their unwind edge. The code below tests to see whether DomBB dominates
|
||||
// the value, so adjust DomBB to the normal destination block, which is
|
||||
// effectively where the value is first usable.
|
||||
if (InvokeInst *Inv = dyn_cast<InvokeInst>(Instr))
|
||||
DomBB = Inv->getNormalDest();
|
||||
|
||||
DomTreeNode *DomNode = DT->getNode(DomBB);
|
||||
|
||||
// Insert the LCSSA phi's into the exit blocks (dominated by the value), and
|
||||
// add them to the Phi's map.
|
||||
@ -158,7 +167,7 @@ void LCSSA::ProcessInstruction(Instruction *Instr,
|
||||
BasicBlock *BB = *BBI;
|
||||
DomTreeNode *ExitBBNode = DT->getNode(BB);
|
||||
Value *&Phi = Phis[ExitBBNode];
|
||||
if (!Phi && DT->dominates(InstrNode, ExitBBNode)) {
|
||||
if (!Phi && DT->dominates(DomNode, ExitBBNode)) {
|
||||
PHINode *PN = PHINode::Create(Instr->getType(), Instr->getName()+".lcssa",
|
||||
BB->begin());
|
||||
PN->reserveOperandSpace(PredCache.GetNumPreds(BB));
|
||||
|
Reference in New Issue
Block a user