diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Utils/LCSSA.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/LCSSA.cpp b/llvm/lib/Transforms/Utils/LCSSA.cpp index 7d4f3a343e6..d5e7303a507 100644 --- a/llvm/lib/Transforms/Utils/LCSSA.cpp +++ b/llvm/lib/Transforms/Utils/LCSSA.cpp @@ -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));  | 

