v3d: Fix temporary leaks of temp_registers and when spilling.
authorEric Anholt <eric@anholt.net>
Tue, 26 Feb 2019 18:46:36 +0000 (10:46 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 5 Mar 2019 20:57:39 +0000 (12:57 -0800)
On each iteration of successfully spilling a reg, we'd allocate another
copy of temp_registers, and when decrementing thread conut we'd allocate
another copy of the graph.  These all got cleaned up on freeing the
compile.

src/broadcom/compiler/vir_register_allocate.c

index 91cce71e0acef84b3f596a263b4808e97fb41908..ae71e502494deee447e5ebb9050ab64c8de5f574 100644 (file)
@@ -394,8 +394,6 @@ v3d_register_allocate(struct v3d_compile *c, bool *spilled)
         struct node_to_temp_map map[c->num_temps];
         uint32_t temp_to_node[c->num_temps];
         uint8_t class_bits[c->num_temps];
-        struct qpu_reg *temp_registers = calloc(c->num_temps,
-                                                sizeof(*temp_registers));
         int acc_nodes[ACC_COUNT];
         struct v3d_ra_select_callback_data callback_data = {
                 .next_acc = 0,
@@ -594,18 +592,19 @@ v3d_register_allocate(struct v3d_compile *c, bool *spilled)
 
                         if (node != -1) {
                                 v3d_spill_reg(c, map[node].temp);
-                                ralloc_free(g);
 
                                 /* Ask the outer loop to call back in. */
                                 *spilled = true;
-                                return NULL;
                         }
                 }
 
-                free(temp_registers);
+                ralloc_free(g);
                 return NULL;
         }
 
+        struct qpu_reg *temp_registers = calloc(c->num_temps,
+                                                sizeof(*temp_registers));
+
         for (uint32_t i = 0; i < c->num_temps; i++) {
                 int ra_reg = ra_get_node_reg(g, temp_to_node[i]);
                 if (ra_reg < PHYS_INDEX) {