[llvm-commits] CVS: llvm/include/llvm/CodeGen/LiveVariables.h

Chris Lattner lattner at cs.uiuc.edu
Tue Jan 3 23:29:45 PST 2006



Changes in directory llvm/include/llvm/CodeGen:

LiveVariables.h updated: 1.27 -> 1.28
---
Log message:

add a comment that I should have written a long time ago


---
Diffs of the changes:  (+28 -0)

 LiveVariables.h |   28 ++++++++++++++++++++++++++++
 1 files changed, 28 insertions(+)


Index: llvm/include/llvm/CodeGen/LiveVariables.h
diff -u llvm/include/llvm/CodeGen/LiveVariables.h:1.27 llvm/include/llvm/CodeGen/LiveVariables.h:1.28
--- llvm/include/llvm/CodeGen/LiveVariables.h:1.27	Tue Jan  3 23:39:51 2006
+++ llvm/include/llvm/CodeGen/LiveVariables.h	Wed Jan  4 01:29:33 2006
@@ -38,6 +38,34 @@
 
 class LiveVariables : public MachineFunctionPass {
 public:
+  /// VarInfo - This represents the regions where a virtual register is live in
+  /// the program.  We represent this with three difference pieces of
+  /// information: the instruction that uniquely defines the value, the set of
+  /// blocks the instruction is live into and live out of, and the set of 
+  /// non-phi instructions that are the last users of the value.
+  ///
+  /// In the common case where a value is defined and killed in the same block,
+  /// DefInst is the defining inst, there is one killing instruction, and 
+  /// AliveBlocks is empty.
+  ///
+  /// Otherwise, the value is live out of the block.  If the value is live
+  /// across any blocks, these blocks are listed in AliveBlocks.  Blocks where
+  /// the liveness range ends are not included in AliveBlocks, instead being
+  /// captured by the Kills set.  In these blocks, the value is live into the
+  /// block (unless the value is defined and killed in the same block) and lives
+  /// until the specified instruction.  Note that there cannot ever be a value
+  /// whose Kills set contains two instructions from the same basic block.
+  ///
+  /// PHI nodes complicate things a bit.  If a PHI node is the last user of a
+  /// value in one of its predecessor blocks, it is not listed in the kills set,
+  /// but does include the predecessor block in the AliveBlocks set (unless that
+  /// block also defines the value).  This leads to the (perfectly sensical)
+  /// situation where a value is defined in a block, and the last use is a phi
+  /// node in the successor.  In this case, DefInst will be the defining
+  /// instruction, AliveBlocks is empty (the value is not live across any 
+  /// blocks) and Kills is empty (phi nodes are not included).  This is sensical
+  /// because the value must be live to the end of the block, but is not live in
+  /// any successor blocks.
   struct VarInfo {
     /// DefInst - The machine instruction that defines this register.
     ///






More information about the llvm-commits mailing list