Use run-length encoding to represent identical adjacent cells in the pressure
and interval table. Reduces output HTML file sizes by ~80% in my test cases.

Also fix access of private member type by << operator.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108823 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/RenderMachineFunction.h b/lib/CodeGen/RenderMachineFunction.h
index 1e604da..090b03e 100644
--- a/lib/CodeGen/RenderMachineFunction.h
+++ b/lib/CodeGen/RenderMachineFunction.h
@@ -223,6 +223,11 @@
                                const char *renderSuffix = 0);
 
   private:
+    class Spacer;
+
+    template <typename OStream>
+    friend OStream& operator<<(OStream &os, const Spacer &s);
+
 
     std::string fqn;
 
@@ -238,9 +243,12 @@
 
     // Utilities.
     typedef enum { Dead, Defined, Used, AliveReg, AliveStack } LiveState;
-
     LiveState getLiveStateAt(const LiveInterval *li, SlotIndex i) const;
 
+    typedef enum { Zero, Low, High } PressureState;
+    PressureState getPressureStateAt(const TargetRegisterClass *trc,
+                                     SlotIndex i) const;
+
     // ---------- Rendering methods ----------
 
     /// For inserting spaces when pretty printing.
@@ -286,6 +294,14 @@
     void renderPressureTableLegend(const Spacer &indent,
                                    OStream &os) const;
 
+    /// \brief Render a consecutive set of HTML cells of the same class using
+    /// the colspan attribute for run-length encoding.
+    template <typename OStream, typename CellType>
+    void renderCellsWithRLE(
+                     const Spacer &indent, OStream &os,
+                     const std::pair<CellType, unsigned> &rleAccumulator,
+                     const std::map<CellType, std::string> &cellTypeStrs) const;
+
     /// \brief Render code listing, potentially with register pressure
     ///        and live intervals shown alongside.
     template <typename OStream>