Adds RABasic verification and tracing.
(retry now that the windows build is green)


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118630 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/LiveIntervalUnion.h b/lib/CodeGen/LiveIntervalUnion.h
index cb07653..74499f6 100644
--- a/lib/CodeGen/LiveIntervalUnion.h
+++ b/lib/CodeGen/LiveIntervalUnion.h
@@ -23,6 +23,12 @@
 
 namespace llvm {
 
+#ifndef NDEBUG
+// forward declaration
+template <unsigned Element> class SparseBitVector;
+typedef SparseBitVector<128> LvrBitSet;
+#endif
+
 /// A LiveSegment is a copy of a LiveRange object used within
 /// LiveIntervalUnion. LiveSegment additionally contains a pointer to its
 /// original live virtual register (LiveInterval). This allows quick lookup of
@@ -51,6 +57,9 @@
 
   // Order segments by starting point only--we expect them to be disjoint.
   bool operator<(const LiveSegment &ls) const { return start < ls.start; }
+
+  void dump() const;
+  void print(raw_ostream &os) const;
 };
 
 inline bool operator<(SlotIndex V, const LiveSegment &ls) {
@@ -74,9 +83,9 @@
 class AbstractRegisterDescription {
 public:
   virtual const char *getName(unsigned reg) const = 0;
-  virtual ~AbstractRegisterDescription() { }
+  virtual ~AbstractRegisterDescription() {}
 };
-  
+
 /// Union of live intervals that are strong candidates for coalescing into a
 /// single register (either physical or virtual depending on the context).  We
 /// expect the constituent live intervals to be disjoint, although we may
@@ -133,6 +142,16 @@
   // Remove a live virtual register's segments from this union.
   void extract(const LiveInterval &lvr);
 
+  void dump(const AbstractRegisterDescription *regInfo) const;
+
+  // If tri != NULL, use it to decode repReg_
+  void print(raw_ostream &os, const AbstractRegisterDescription *rdesc) const;
+  
+#ifndef NDEBUG
+  // Verify the live intervals in this union and add them to the visited set.
+  void verify(LvrBitSet& visitedVRegs);
+#endif
+
   /// Cache a single interference test result in the form of two intersecting
   /// segments. This allows efficiently iterating over the interferences. The
   /// iteration logic is handled by LiveIntervalUnion::Query which may