diff options
author | Dan Gohman <gohman@apple.com> | 2009-03-23 15:49:37 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-03-23 15:49:37 +0000 |
commit | 5aabc424b1a8cbf2c5818e817bd07289f64ee216 (patch) | |
tree | b9a2fec00fa7a2f0003619c7ad1276a1037bbf8c /llvm/lib/Analysis/LiveValues.cpp | |
parent | 87cd443ae95724f9bf7ba562ff1d82b88c4a35d1 (diff) | |
download | bcm5719-llvm-5aabc424b1a8cbf2c5818e817bd07289f64ee216.tar.gz bcm5719-llvm-5aabc424b1a8cbf2c5818e817bd07289f64ee216.zip |
Enhance LiveValues to work on PHI operands.
llvm-svn: 67523
Diffstat (limited to 'llvm/lib/Analysis/LiveValues.cpp')
-rw-r--r-- | llvm/lib/Analysis/LiveValues.cpp | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/llvm/lib/Analysis/LiveValues.cpp b/llvm/lib/Analysis/LiveValues.cpp index 21ddf6bc363..7fc97c9cda7 100644 --- a/llvm/lib/Analysis/LiveValues.cpp +++ b/llvm/lib/Analysis/LiveValues.cpp @@ -142,21 +142,32 @@ LiveValues::Memo &LiveValues::compute(const Value *V) { if (L->contains(UseBB)) break; - if (isa<PHINode>(U)) { - // The value is used by a PHI, so it is live-out of the defining block. - LiveOutOfDefBB = true; - } else if (UseBB != DefBB) { - // A use outside the defining block has been found. + // Search for live-through blocks. + const BasicBlock *BB; + if (const PHINode *PHI = dyn_cast<PHINode>(U)) { + // For PHI nodes, start the search at the incoming block paired with the + // incoming value, which must be dominated by the definition. + unsigned Num = PHI->getIncomingValueNumForOperand(I.getOperandNo()); + BB = PHI->getIncomingBlock(Num); + + // A PHI-node use means the value is live-out of it's defining block + // even if that block also contains the only use. LiveOutOfDefBB = true; + } else { + // Otherwise just start the search at the use. + BB = UseBB; + + // Note if the use is outside the defining block. + LiveOutOfDefBB |= UseBB != DefBB; + } - // Climb the immediate dominator tree from the use to the definition - // and mark all intermediate blocks as live-through. Don't do this if - // the user is a PHI because such users may not be dominated by the - // definition. - for (const BasicBlock *BB = getImmediateDominator(UseBB, DT); - BB != DefBB; BB = getImmediateDominator(BB, DT)) - if (!M.LiveThrough.insert(BB)) - break; + // Climb the immediate dominator tree from the use to the definition + // and mark all intermediate blocks as live-through. Don't do this if + // the user is a PHI because such users may not be dominated by the + // definition. + for (; BB != DefBB; BB = getImmediateDominator(BB, DT)) { + if (BB != UseBB && !M.LiveThrough.insert(BB)) + break; } } |