mesa: Reduce the memory usage for reg alloc with many graph nodes (part 1)
authorEric Anholt <eric@anholt.net>
Wed, 20 Feb 2013 00:46:41 +0000 (16:46 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 11 Mar 2013 19:11:54 +0000 (12:11 -0700)
We were allocating an adjacency_list entry for every possible
interference that could get created, but that usually doesn't happen.
We can save a lot of memory by resizing the array on demand.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/program/register_allocate.c

index 88793dbdc1e2f7e7831f51d1566bd8f1613f8729..5862c78661a68a7afd2d6151b571f259977a60f2 100644 (file)
@@ -120,6 +120,7 @@ struct ra_node {
     */
    GLboolean *adjacency;
    unsigned int *adjacency_list;
+   unsigned int adjacency_list_size;
    unsigned int adjacency_count;
    /** @} */
 
@@ -307,6 +308,15 @@ static void
 ra_add_node_adjacency(struct ra_graph *g, unsigned int n1, unsigned int n2)
 {
    g->nodes[n1].adjacency[n2] = GL_TRUE;
+
+   if (g->nodes[n1].adjacency_count >=
+       g->nodes[n1].adjacency_list_size) {
+      g->nodes[n1].adjacency_list_size *= 2;
+      g->nodes[n1].adjacency_list = reralloc(g, g->nodes[n1].adjacency_list,
+                                             unsigned int,
+                                             g->nodes[n1].adjacency_list_size);
+   }
+
    g->nodes[n1].adjacency_list[g->nodes[n1].adjacency_count] = n2;
    g->nodes[n1].adjacency_count++;
 }
@@ -326,7 +336,9 @@ ra_alloc_interference_graph(struct ra_regs *regs, unsigned int count)
 
    for (i = 0; i < count; i++) {
       g->nodes[i].adjacency = rzalloc_array(g, GLboolean, count);
-      g->nodes[i].adjacency_list = ralloc_array(g, unsigned int, count);
+      g->nodes[i].adjacency_list_size = 4;
+      g->nodes[i].adjacency_list =
+         ralloc_array(g, unsigned int, g->nodes[i].adjacency_list_size);
       g->nodes[i].adjacency_count = 0;
       ra_add_node_adjacency(g, i, i);
       g->nodes[i].reg = NO_REG;