[llvm-commits] [llvm] r78359 - in /llvm/trunk/lib/CodeGen/PBQP: AnnotatedGraph.h ExhaustiveSolver.h GraphBase.h GraphGenerator.h HeuristicSolver.h Heuristics/Briggs.h PBQPMath.h SimpleGraph.h Solution.h Solver.h

Lang Hames lhames at gmail.com
Thu Aug 6 17:25:13 PDT 2009


Author: lhames
Date: Thu Aug  6 19:25:12 2009
New Revision: 78359

URL: http://llvm.org/viewvc/llvm-project?rev=78359&view=rev
Log:
Added legal stuff, fixed some formatting issues. Removed the graph generator stuff as it was only meant for debugging the solver.

Removed:
    llvm/trunk/lib/CodeGen/PBQP/GraphGenerator.h
Modified:
    llvm/trunk/lib/CodeGen/PBQP/AnnotatedGraph.h
    llvm/trunk/lib/CodeGen/PBQP/ExhaustiveSolver.h
    llvm/trunk/lib/CodeGen/PBQP/GraphBase.h
    llvm/trunk/lib/CodeGen/PBQP/HeuristicSolver.h
    llvm/trunk/lib/CodeGen/PBQP/Heuristics/Briggs.h
    llvm/trunk/lib/CodeGen/PBQP/PBQPMath.h
    llvm/trunk/lib/CodeGen/PBQP/SimpleGraph.h
    llvm/trunk/lib/CodeGen/PBQP/Solution.h
    llvm/trunk/lib/CodeGen/PBQP/Solver.h

Modified: llvm/trunk/lib/CodeGen/PBQP/AnnotatedGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/AnnotatedGraph.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/AnnotatedGraph.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/AnnotatedGraph.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,17 @@
+//===-- AnnotatedGraph.h - Annotated PBQP Graph ----------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Annotated PBQP Graph class. This class is used internally by the PBQP solver
+// to cache information to speed up reduction.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_ANNOTATEDGRAPH_H
 #define LLVM_CODEGEN_PBQP_ANNOTATEDGRAPH_H
 

Modified: llvm/trunk/lib/CodeGen/PBQP/ExhaustiveSolver.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/ExhaustiveSolver.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/ExhaustiveSolver.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/ExhaustiveSolver.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,18 @@
+//===-- ExhaustiveSolver.h - Brute Force PBQP Solver -----------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Uses a trivial brute force algorithm to solve a PBQP problem.
+// PBQP is NP-HARD - This solver should only be used for debugging small
+// problems.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_EXHAUSTIVESOLVER_H
 #define LLVM_CODEGEN_PBQP_EXHAUSTIVESOLVER_H
 
@@ -5,6 +20,8 @@
 
 namespace PBQP {
 
+/// A brute force PBQP solver. This solver takes exponential time. It should
+/// only be used for debugging purposes. 
 class ExhaustiveSolverImpl {
 private:
 

Modified: llvm/trunk/lib/CodeGen/PBQP/GraphBase.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/GraphBase.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/GraphBase.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/GraphBase.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,17 @@
+//===-- GraphBase.h - Abstract Base PBQP Graph -----------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Base class for PBQP Graphs.
+//
+//===----------------------------------------------------------------------===//
+
+
 #ifndef LLVM_CODEGEN_PBQP_GRAPHBASE_H
 #define LLVM_CODEGEN_PBQP_GRAPHBASE_H
 

Removed: llvm/trunk/lib/CodeGen/PBQP/GraphGenerator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/GraphGenerator.h?rev=78358&view=auto

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/GraphGenerator.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/GraphGenerator.h (removed)
@@ -1,195 +0,0 @@
-#ifndef LLVM_CODEGEN_PBQP_GRAPHGENERATOR_H
-#define LLVM_CODEGEN_PBQP_GRAPHGENERATOR_H
-
-#include "PBQPMath.h"
-
-namespace PBQP {
-
-unsigned randRange(unsigned min, unsigned max) {
-  return min + (rand() % (max - min + 1));
-}
-
-class BasicNodeCostsGenerator {
-private:
-
-  unsigned maxDegree, minCost, maxCost;
-
-
-public:
-
-  BasicNodeCostsGenerator(unsigned maxDegree, unsigned minCost,
-                          unsigned maxCost) :
-    maxDegree(maxDegree), minCost(minCost), maxCost(maxCost) { }
-
-  Vector operator()() const {
-    Vector v(randRange(1, maxDegree));
-    for (unsigned i = 0; i < v.getLength(); ++i) {
-      v[i] = randRange(minCost, maxCost);
-    }
-    return v;
-  };
-
-};
-
-class FixedDegreeSpillCostGenerator {
-private:
-
-  unsigned degree, spillCostMin, spillCostMax;
-
-public:
-
-  FixedDegreeSpillCostGenerator(unsigned degree, unsigned spillCostMin,
-                                unsigned spillCostMax) :
-    degree(degree), spillCostMin(spillCostMin), spillCostMax(spillCostMax) { }
-
-  Vector operator()() const {
-    Vector v(degree, 0);
-    v[0] = randRange(spillCostMin, spillCostMax);
-    return v;
-  }
-
-};
-
-class BasicEdgeCostsGenerator {
-private:
-
-  unsigned minCost, maxCost;
-
-public:
-
-  BasicEdgeCostsGenerator(unsigned minCost, unsigned maxCost) :
-    minCost(minCost), maxCost(maxCost) {}
-
-  Matrix operator()(const SimpleGraph &g,
-                        const SimpleGraph::ConstNodeIterator &n1,
-                        const SimpleGraph::ConstNodeIterator &n2) const {
-
-    Matrix m(g.getNodeCosts(n1).getLength(),
-                 g.getNodeCosts(n2).getLength());
-
-    for (unsigned i = 0; i < m.getRows(); ++i) {
-      for (unsigned j = 0; j < m.getCols(); ++j) {
-        m[i][j] = randRange(minCost, maxCost);
-      }
-    }
-
-    return m;
-  }
-
-};
-
-class InterferenceCostsGenerator {
-public:
-
-  Matrix operator()(const SimpleGraph &g,
-                        const SimpleGraph::ConstNodeIterator &n1,
-                        const SimpleGraph::ConstNodeIterator &n2) const {
-
-    unsigned len = g.getNodeCosts(n1).getLength();
-
-    assert(len == g.getNodeCosts(n2).getLength());
-
-    Matrix m(len, len);
-
-    m[0][0] = 0;
-    for (unsigned i = 1; i < len; ++i) {
-      m[i][i] = std::numeric_limits<PBQPNum>::infinity();
-    }
-
-    return m;
-  }
-};
-
-class RingEdgeGenerator {
-public:
-
-  template <typename EdgeCostsGenerator>
-  void operator()(SimpleGraph &g, EdgeCostsGenerator &edgeCostsGen) {
-
-    assert(g.areNodeIDsValid() && "Graph must have valid node IDs.");
-
-    if (g.getNumNodes() < 2)
-      return;
-
-    if (g.getNumNodes() == 2) {
-      SimpleGraph::NodeIterator n1 = g.getNodeItr(0),
-                                n2 = g.getNodeItr(1);
-      g.addEdge(n1, n2, edgeCostsGen(g, n1, n2));
-      return;
-    }
-
-    // Else |V| > 2:
-    for (unsigned i = 0; i < g.getNumNodes(); ++i) {
-      SimpleGraph::NodeIterator
-        n1 = g.getNodeItr(i),
-        n2 = g.getNodeItr((i + 1) % g.getNumNodes());
-      g.addEdge(n1, n2, edgeCostsGen(g, n1, n2));
-    }
-  }
-
-};
-
-class FullyConnectedEdgeGenerator {
-public:
-    
-  template <typename EdgeCostsGenerator>
-  void operator()(SimpleGraph &g, EdgeCostsGenerator &edgeCostsGen) {
-    assert(g.areNodeIDsValid() && "Graph must have valid node IDs.");
-    
-    for (unsigned i = 0; i < g.getNumNodes(); ++i) {
-      for (unsigned j = i + 1; j < g.getNumNodes(); ++j) {
-        SimpleGraph::NodeIterator
-          n1 = g.getNodeItr(i),
-          n2 = g.getNodeItr(j);
-        g.addEdge(n1, n2, edgeCostsGen(g, n1, n2));
-      }
-    }
-  }
-
-};
-
-class RandomEdgeGenerator {
-public:
-
-  template <typename EdgeCostsGenerator>
-  void operator()(SimpleGraph &g, EdgeCostsGenerator &edgeCostsGen) {
-    
-    assert(g.areNodeIDsValid() && "Graph must have valid node IDs.");
-    
-    for (unsigned i = 0; i < g.getNumNodes(); ++i) {
-      for (unsigned j = i + 1; j < g.getNumNodes(); ++j) {
-        if (rand() % 2 == 0) {
-          SimpleGraph::NodeIterator
-            n1 = g.getNodeItr(i),
-            n2 = g.getNodeItr(j);
-          g.addEdge(n1, n2, edgeCostsGen(g, n1, n2));
-        }
-      }
-    }
-  }
-
-};
-
-template <typename NodeCostsGenerator,
-          typename EdgesGenerator,
-          typename EdgeCostsGenerator>
-SimpleGraph createRandomGraph(unsigned numNodes,
-                              NodeCostsGenerator nodeCostsGen,
-                              EdgesGenerator edgeGen,
-                              EdgeCostsGenerator edgeCostsGen) {
-
-  SimpleGraph g;
-  for (unsigned n = 0; n < numNodes; ++n) {
-    g.addNode(nodeCostsGen());
-  }
-
-  g.assignNodeIDs();
-
-  edgeGen(g, edgeCostsGen);
-
-  return g;
-}
-
-}
-
-#endif // LLVM_CODEGEN_PBQP_GRAPHGENERATOR_H

Modified: llvm/trunk/lib/CodeGen/PBQP/HeuristicSolver.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/HeuristicSolver.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/HeuristicSolver.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/HeuristicSolver.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,18 @@
+//===-- HeuristicSolver.h - Heuristic PBQP Solver --------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Heuristic PBQP solver. This solver is able to perform optimal reductions for
+// nodes of degree 0, 1 or 2. For nodes of degree >2 a plugable heuristic is
+// used to to select a node for reduction. 
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_HEURISTICSOLVER_H
 #define LLVM_CODEGEN_PBQP_HEURISTICSOLVER_H
 
@@ -153,9 +168,7 @@
   typedef std::vector<GraphNodeIterator> NodeStack;
   typedef typename NodeStack::iterator NodeStackIterator;
 
-  /*!
-   * \brief Constructor, which performs all the actual solver work.
-   */
+  /// \brief Constructor, which performs all the actual solver work.
   HeuristicSolverImpl(const SimpleGraph &orig) :
     solution(orig.getNumNodes(), true)
   {
@@ -166,22 +179,16 @@
     computeSolutionCost(orig);
   }
 
-  /*!
-   * \brief Returns the graph for this solver.
-   */
+  /// \brief Returns the graph for this solver.
   SolverGraph& getGraph() { return g; }
 
-  /*!
-   * \brief Return the solution found by this solver.
-   */
+  /// \brief Return the solution found by this solver.
   const Solution& getSolution() const { return solution; }
 
 private:
 
-  /*!
-   * \brief Add the given node to the appropriate bucket for its link
-   * degree.
-   */
+  /// \brief Add the given node to the appropriate bucket for its link
+  /// degree.
   void addToBucket(const GraphNodeIterator &nodeItr) {
     NodeData &nodeData = g.getNodeData(nodeItr);
 
@@ -200,10 +207,8 @@
     }
   }
 
-  /*!
-   * \brief Remove the given node from the appropriate bucket for its link
-   * degree.
-   */
+  /// \brief Remove the given node from the appropriate bucket for its link
+  /// degree.
   void removeFromBucket(const GraphNodeIterator &nodeItr) {
     NodeData &nodeData = g.getNodeData(nodeItr);
 
@@ -217,9 +222,7 @@
 
 public:
 
-  /*!
-   * \brief Add a link.
-   */
+  /// \brief Add a link.
   void addLink(const GraphEdgeIterator &edgeItr) {
     g.getEdgeData(edgeItr).setup(edgeItr);
 
@@ -229,12 +232,10 @@
     }
   }
 
-  /*!
-   * \brief Remove link, update info for node.
-   *
-   * Only updates information for the given node, since usually the other
-   * is about to be removed.
-   */
+  /// \brief Remove link, update info for node.
+  ///
+  /// Only updates information for the given node, since usually the other
+  /// is about to be removed.
   void removeLink(const GraphEdgeIterator &edgeItr,
                   const GraphNodeIterator &nodeItr) {
 
@@ -244,9 +245,7 @@
     g.getEdgeData(edgeItr).unlink();
   }
 
-  /*!
-   * \brief Remove link, update info for both nodes. Useful for R2 only.
-   */
+  /// \brief Remove link, update info for both nodes. Useful for R2 only.
   void removeLinkR2(const GraphEdgeIterator &edgeItr) {
     GraphNodeIterator node1Itr = g.getEdgeNode1Itr(edgeItr);
 
@@ -256,9 +255,7 @@
     removeLink(edgeItr, g.getEdgeNode2Itr(edgeItr));
   }
 
-  /*!
-   * \brief Removes all links connected to the given node.
-   */
+  /// \brief Removes all links connected to the given node.
   void unlinkNode(const GraphNodeIterator &nodeItr) {
     NodeData &nodeData = g.getNodeData(nodeItr);
 
@@ -284,17 +281,13 @@
     }
   }
 
-  /*!
-   * \brief Push the given node onto the stack to be solved with
-   * backpropagation.
-   */
+  /// \brief Push the given node onto the stack to be solved with
+  /// backpropagation.
   void pushStack(const GraphNodeIterator &nodeItr) {
     stack.push_back(nodeItr);
   }
 
-  /*!
-   * \brief Set the solution of the given node.
-   */
+  /// \brief Set the solution of the given node.
   void setSolution(const GraphNodeIterator &nodeItr, unsigned solIndex) {
     solution.setSelection(g.getNodeID(nodeItr), solIndex);
 

Modified: llvm/trunk/lib/CodeGen/PBQP/Heuristics/Briggs.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/Heuristics/Briggs.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/Heuristics/Briggs.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/Heuristics/Briggs.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,20 @@
+//===-- Briggs.h --- Briggs Heuristic for PBQP -----------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This class implements the Briggs test for "allocability" of nodes in a
+// PBQP graph representing a register allocation problem. Nodes which can be
+// proven allocable (by a safe and relatively accurate test) are removed from
+// the PBQP graph first. If no provably allocable node is present in the graph
+// then the node with the minimal spill-cost to degree ratio is removed.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_HEURISTICS_BRIGGS_H
 #define LLVM_CODEGEN_PBQP_HEURISTICS_BRIGGS_H
 
@@ -327,26 +344,7 @@
   }
 
   void processRN() {
-
-   /* 
-    std::cerr << "processRN():\n"
-              << "  rNAllocable = [ ";
-    for (RNAllocableNodeListIterator nItr = rNAllocableBucket.begin(),
-                                     nEnd = rNAllocableBucket.end();
-         nItr != nEnd; ++nItr) {
-      std::cerr << g->getNodeID(*nItr) << " (" << g->getNodeData(*nItr).getLinkDegree() << ")    ";
-    }
-    std::cerr << "]\n"
-              << "  rNUnallocable = [ ";
-    for (RNUnallocableNodeListIterator nItr = rNUnallocableBucket.begin(),
-                                       nEnd = rNUnallocableBucket.end();
-         nItr != nEnd; ++nItr) {
-      float bCost = g->getNodeCosts(*nItr)[0] / g->getNodeData(*nItr).getLinkDegree();
-      std::cerr << g->getNodeID(*nItr) << " (" << bCost << ")   ";
-    }
-    std::cerr << "]\n";
-    */
-
+    
     if (!rNAllocableBucket.empty()) {
       GraphNodeIterator selectedNodeItr = *rNAllocableBucket.begin();
       //std::cerr << "RN safely pushing " << g->getNodeID(selectedNodeItr) << "\n";

Modified: llvm/trunk/lib/CodeGen/PBQP/PBQPMath.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/PBQPMath.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/PBQPMath.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/PBQPMath.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,12 @@
+//===-- PBQPMath.h - PBQP Vector and Matrix classes ------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_PBQPMATH_H 
 #define LLVM_CODEGEN_PBQP_PBQPMATH_H
 

Modified: llvm/trunk/lib/CodeGen/PBQP/SimpleGraph.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/SimpleGraph.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/SimpleGraph.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/SimpleGraph.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,17 @@
+//===-- SimpleGraph.h - Simple PBQP Graph ----------------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Simple PBQP graph class representing a PBQP problem. Graphs of this type
+// can be passed to a PBQPSolver instance to solve the PBQP problem.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_SIMPLEGRAPH_H
 #define LLVM_CODEGEN_PBQP_SIMPLEGRAPH_H
 

Modified: llvm/trunk/lib/CodeGen/PBQP/Solution.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/Solution.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/Solution.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/Solution.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,17 @@
+//===-- Solution.h ------- PBQP Solution -----------------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Annotated PBQP Graph class. This class is used internally by the PBQP solver
+// to cache information to speed up reduction.
+//
+//===----------------------------------------------------------------------===//
+
 #ifndef LLVM_CODEGEN_PBQP_SOLUTION_H
 #define LLVM_CODEGEN_PBQP_SOLUTION_H
 

Modified: llvm/trunk/lib/CodeGen/PBQP/Solver.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PBQP/Solver.h?rev=78359&r1=78358&r2=78359&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PBQP/Solver.h (original)
+++ llvm/trunk/lib/CodeGen/PBQP/Solver.h Thu Aug  6 19:25:12 2009
@@ -1,3 +1,13 @@
+//===-- Solver.h ------- PBQP solver interface -----------------*- C++ --*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
 #ifndef LLVM_CODEGEN_PBQP_SOLVER_H
 #define LLVM_CODEGEN_PBQP_SOLVER_H
 





More information about the llvm-commits mailing list