[Mesa-dev] [PATCH 2/5] panfrost: Free all block/instruction objects before leaving midgard_compile_shader_nir()

Boris Brezillon boris.brezillon at collabora.com
Tue Aug 27 10:36:41 UTC 2019


Right now we're leaking all block and instruction objects allocated by
the compiler. Let's clean things up before leaving
midgard_compile_shader_nir().

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
---
 src/panfrost/midgard/compiler.h        | 12 ++++++++++++
 src/panfrost/midgard/midgard_compile.c |  3 +++
 2 files changed, 15 insertions(+)

diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h
index f9ba31b5959d..d131bb8c1915 100644
--- a/src/panfrost/midgard/compiler.h
+++ b/src/panfrost/midgard/compiler.h
@@ -333,6 +333,9 @@ mir_next_op(struct midgard_instruction *ins)
 #define mir_foreach_block(ctx, v) \
         list_for_each_entry(struct midgard_block, v, &ctx->blocks, link)
 
+#define mir_foreach_block_safe(ctx, v) \
+        list_for_each_entry_safe(struct midgard_block, v, &ctx->blocks, link)
+
 #define mir_foreach_block_from(ctx, from, v) \
         list_for_each_entry_from(struct midgard_block, v, from, &ctx->blocks, link)
 
@@ -392,6 +395,15 @@ mir_next_op(struct midgard_instruction *ins)
 #define mir_foreach_src(ins, v) \
         for (unsigned v = 0; v < ARRAY_SIZE(ins->src); ++v)
 
+static inline void mir_remove_block(struct midgard_block *block)
+{
+        mir_foreach_instr_in_block_safe(block, ins)
+                mir_remove_instruction(ins);
+
+        list_del(&block->link);
+        free(block);
+}
+
 static inline midgard_instruction *
 mir_last_in_block(struct midgard_block *block)
 {
diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c
index 74511b278d16..56a752433143 100644
--- a/src/panfrost/midgard/midgard_compile.c
+++ b/src/panfrost/midgard/midgard_compile.c
@@ -2835,6 +2835,9 @@ midgard_compile_shader_nir(struct midgard_screen *screen, nir_shader *nir, midga
                         ctx->spills, ctx->fills);
         }
 
+        mir_foreach_block_safe(ctx, block)
+                mir_remove_block(block);
+
         ralloc_free(ctx);
 
         return 0;
-- 
2.21.0



More information about the mesa-dev mailing list