From 114e6a310490e40e58c1e2a0f36a6ff95bcc07cf Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 11 Sep 2025 13:02:57 -0700 Subject: [PATCH] ir3: Use a linear allocation context for ir3_instructions. Again, instrs don't get freed as we go, so the linear gc context saves us 5 pointers per instr. Fossil replay time for deadspace3 on a debugoptimized build -4.85258% +/- 3.04009% (n=10) Part-of: --- src/freedreno/ir3/ir3.c | 4 ++-- src/freedreno/ir3/ir3_compiler_nir.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index f15ce67ce9f..0ce4d9ae62a 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -883,7 +883,7 @@ instr_create(struct ir3_block *block, opc_t opc, int ndst, int nsrc) struct ir3_instruction *instr; unsigned sz = sizeof(*instr) + (ndst * sizeof(instr->dsts[0])) + (nsrc * sizeof(instr->srcs[0])); - char *ptr = ir3_alloc(block->shader, sz); + char *ptr = linear_zalloc_child(block->shader->lin_ctx, sz); instr = (struct ir3_instruction *)ptr; ptr += sizeof(*instr); @@ -1012,7 +1012,7 @@ ir3_instr_add_dep(struct ir3_instruction *instr, struct ir3_instruction *dep) return; } - array_insert(instr, instr->deps, dep); + array_insert(instr->block->shader, instr->deps, dep); } void diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 3be738b5a52..0a66786b6c8 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -5725,7 +5725,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler, for (unsigned i = 0; i < outputs_count; i++) __ssa_src(chmask, outputs[i], 0)->num = regids[i]; - chmask->end.outidxs = ralloc_array(chmask, unsigned, outputs_count); + chmask->end.outidxs = linear_alloc_array(ir->lin_ctx, unsigned, outputs_count); memcpy(chmask->end.outidxs, outidxs, sizeof(unsigned) * outputs_count); array_insert(ctx->block, ctx->block->keeps, chmask); @@ -5816,7 +5816,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler, __ssa_src(end, outputs[i], 0); } - end->end.outidxs = ralloc_array(end, unsigned, outputs_count); + end->end.outidxs = linear_alloc_array(ir->lin_ctx, unsigned, outputs_count); memcpy(end->end.outidxs, outidxs, sizeof(unsigned) * outputs_count); array_insert(ctx->block, ctx->block->keeps, end);