From 73835f4b0997a7106cd4d5a5f84ab5cb161fd528 Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Tue, 20 Jul 2021 17:05:43 +0200 Subject: [PATCH] aco/spill: Use arena allocator for next use distances MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Speedup of aco::spill(): ~50% Co-authored-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_spill.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index da92881..5f85212 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -25,6 +25,7 @@ #include "aco_builder.h" #include "aco_ir.h" +#include "aco_util.h" #include "common/sid.h" @@ -65,6 +66,8 @@ struct remat_info { struct spill_ctx { RegisterDemand target_pressure; Program* program; + aco::monotonic_buffer_resource memory; + std::vector> register_demand; std::vector> renames; std::vector> spills_entry; @@ -72,8 +75,10 @@ struct spill_ctx { std::vector processed; std::stack> loop_header; - std::vector>> next_use_distances_start; - std::vector>> next_use_distances_end; + + using next_use_distance_startend_type = aco::unordered_map>; + std::vector next_use_distances_start; + std::vector next_use_distances_end; std::vector>> local_next_use_distance; /* Working buffer */ std::vector>> interferences; std::vector> affinities; @@ -88,11 +93,13 @@ struct spill_ctx { spill_ctx(const RegisterDemand target_pressure_, Program* program_, std::vector> register_demand_) - : target_pressure(target_pressure_), program(program_), + : target_pressure(target_pressure_), program(program_), memory(), register_demand(std::move(register_demand_)), renames(program->blocks.size()), spills_entry(program->blocks.size()), spills_exit(program->blocks.size()), - processed(program->blocks.size(), false), wave_size(program->wave_size), - sgpr_spill_slots(0), vgpr_spill_slots(0) + processed(program->blocks.size(), false), + next_use_distances_start(program->blocks.size(), next_use_distance_startend_type(memory)), + next_use_distances_end(program->blocks.size(), next_use_distance_startend_type(memory)), + wave_size(program->wave_size), sgpr_spill_slots(0), vgpr_spill_slots(0) {} void add_affinity(uint32_t first, uint32_t second) @@ -273,9 +280,6 @@ next_uses_per_block(spill_ctx& ctx, unsigned block_idx, uint32_t& worklist) void compute_global_next_uses(spill_ctx& ctx) { - ctx.next_use_distances_start.resize(ctx.program->blocks.size()); - ctx.next_use_distances_end.resize(ctx.program->blocks.size()); - uint32_t worklist = ctx.program->blocks.size(); while (worklist) { unsigned block_idx = --worklist; -- 2.7.4