From: Eric Anholt Date: Tue, 26 Feb 2019 18:46:36 +0000 (-0800) Subject: v3d: Fix temporary leaks of temp_registers and when spilling. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=060979a380be0a6149e3e875ee24fdb1e7872821;p=mesa.git v3d: Fix temporary leaks of temp_registers and when spilling. 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. --- diff --git a/src/broadcom/compiler/vir_register_allocate.c b/src/broadcom/compiler/vir_register_allocate.c index 91cce71e0ac..ae71e502494 100644 --- a/src/broadcom/compiler/vir_register_allocate.c +++ b/src/broadcom/compiler/vir_register_allocate.c @@ -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) {