aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Utils/LCSSA.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-06-26 00:31:13 +0000
committerDan Gohman <gohman@apple.com>2009-06-26 00:31:13 +0000
commit6b9c959c61e77b1bc78a93ee4a6cac8eaa656a21 (patch)
tree4ec94480766a2d191c0fdf3d6dd6dba7031b6c4a /lib/Transforms/Utils/LCSSA.cpp
parent151b9afdee10995add2f28790194570e7735f03c (diff)
downloadexternal_llvm-6b9c959c61e77b1bc78a93ee4a6cac8eaa656a21.zip
external_llvm-6b9c959c61e77b1bc78a93ee4a6cac8eaa656a21.tar.gz
external_llvm-6b9c959c61e77b1bc78a93ee4a6cac8eaa656a21.tar.bz2
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
Diffstat (limited to 'lib/Transforms/Utils/LCSSA.cpp')
-rw-r--r--lib/Transforms/Utils/LCSSA.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp
index 7d4f3a3..d5e7303 100644
--- a/lib/Transforms/Utils/LCSSA.cpp
+++ b/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));