diff --git a/src/amd/compiler/aco_interface.cpp b/src/amd/compiler/aco_interface.cpp index 03544424c2e..89d3bc6ea89 100644 --- a/src/amd/compiler/aco_interface.cpp +++ b/src/amd/compiler/aco_interface.cpp @@ -257,6 +257,8 @@ aco_compile_shader(const struct aco_compiler_options* options, if (program->collect_statistics) stats_size = aco::num_statistics * sizeof(uint32_t); + aco::instruction_buffer.release(); + (*build_binary)(binary, shaders[shader_count - 1]->info.stage, args->is_gs_copy_shader, @@ -308,6 +310,8 @@ aco_compile_vs_prolog(const struct aco_compiler_options* options, if (get_disasm) disasm = get_disasm_string(program.get(), code, exec_size); + aco::instruction_buffer.release(); + (*build_prolog)(binary, config.num_sgprs, config.num_vgprs, @@ -353,6 +357,8 @@ aco_compile_ps_epilog(const struct aco_compiler_options* options, if (get_disasm) disasm = get_disasm_string(program.get(), code, exec_size); + aco::instruction_buffer.release(); + (*build_epilog)(binary, config.num_sgprs, config.num_vgprs, diff --git a/src/amd/compiler/aco_ir.cpp b/src/amd/compiler/aco_ir.cpp index 44d91f8a51c..04bb850f7c3 100644 --- a/src/amd/compiler/aco_ir.cpp +++ b/src/amd/compiler/aco_ir.cpp @@ -32,6 +32,8 @@ namespace aco { +thread_local aco::monotonic_buffer_resource instruction_buffer(65536); + uint64_t debug_flags = 0; static const struct debug_control aco_debug_options[] = {{"validateir", DEBUG_VALIDATE_IR}, diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h index 1f9d7cb1cb3..57e7834a997 100644 --- a/src/amd/compiler/aco_ir.h +++ b/src/amd/compiler/aco_ir.h @@ -1774,8 +1774,13 @@ struct Pseudo_reduction_instruction : public Instruction { static_assert(sizeof(Pseudo_reduction_instruction) == sizeof(Instruction) + 4, "Unexpected padding"); +extern thread_local aco::monotonic_buffer_resource instruction_buffer; + struct instr_deleter_functor { - void operator()(void* p) { free(p); } + /* Don't yet free any instructions. They will be de-allocated + * all at once after compilation finished. + */ + void operator()(void* p) { return; } }; template using aco_ptr = std::unique_ptr; @@ -1787,7 +1792,8 @@ create_instruction(aco_opcode opcode, Format format, uint32_t num_operands, { std::size_t size = sizeof(T) + num_operands * sizeof(Operand) + num_definitions * sizeof(Definition); - void* data = calloc(1, size); + void* data = instruction_buffer.allocate(size, alignof(uint32_t)); + memset(data, 0, size); T* inst = (T*)data; inst->opcode = opcode;