From 61c36b6dc0a275057df160a20e709acbae9c0450 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Jun 2021 17:45:16 +0200 Subject: [PATCH] aco/ra: refactor find_vars() to return a vector instead of std::set<> No fossil-db changes. Reviewed-by: Rhys Perry Part-of: --- src/amd/compiler/aco_register_allocation.cpp | 42 +++++++++++++++------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index 69bcf09..7b88559 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -366,8 +366,8 @@ private: } }; -std::set> find_vars(ra_ctx& ctx, RegisterFile& reg_file, - const PhysRegInterval reg_interval); +std::vector find_vars(ra_ctx& ctx, RegisterFile& reg_file, + const PhysRegInterval reg_interval); /* helper function for debugging */ UNUSED void @@ -453,9 +453,10 @@ print_regs(ra_ctx& ctx, bool vgprs, RegisterFile& reg_file) /* print assignments ordered by registers */ std::map> regs_to_vars; /* maps to byte size and temp id */ - for (const auto& size_id : find_vars(ctx, reg_file, regs)) { - auto reg = ctx.assignments[size_id.second].reg; - ASSERTED auto inserted = regs_to_vars.emplace(reg, size_id); + for (unsigned id : find_vars(ctx, reg_file, regs)) { + const assignment& var = ctx.assignments[id]; + PhysReg reg = var.reg; + ASSERTED auto inserted = regs_to_vars.emplace(reg, std::make_pair(var.rc.bytes(), id)); assert(inserted.second); } @@ -982,26 +983,24 @@ get_reg_simple(ra_ctx& ctx, RegisterFile& reg_file, DefInfo info) return {{}, false}; } -/* collect variables from a register area and clear reg_file */ -std::set> +/* collect variables from a register area */ +std::vector find_vars(ra_ctx& ctx, RegisterFile& reg_file, const PhysRegInterval reg_interval) { - std::set> vars; + std::vector vars; for (PhysReg j : reg_interval) { if (reg_file.is_blocked(j)) continue; if (reg_file[j] == 0xF0000000) { for (unsigned k = 0; k < 4; k++) { unsigned id = reg_file.subdword_regs[j][k]; - if (id) { - assignment& var = ctx.assignments[id]; - vars.emplace(var.rc.bytes(), id); - } + if (id && (vars.empty() || id != vars.back())) + vars.emplace_back(id); } - } else if (reg_file[j] != 0) { + } else { unsigned id = reg_file[j]; - assignment& var = ctx.assignments[id]; - vars.emplace(var.rc.bytes(), id); + if (id && (vars.empty() || id != vars.back())) + vars.emplace_back(id); } } return vars; @@ -1011,10 +1010,13 @@ find_vars(ra_ctx& ctx, RegisterFile& reg_file, const PhysRegInterval reg_interva std::set> collect_vars(ra_ctx& ctx, RegisterFile& reg_file, const PhysRegInterval reg_interval) { - std::set> vars = find_vars(ctx, reg_file, reg_interval); - for (std::pair size_id : vars) { - assignment& var = ctx.assignments[size_id.second]; + std::vector ids = find_vars(ctx, reg_file, reg_interval); + std::set> vars; + + for (unsigned id : ids) { + assignment& var = ctx.assignments[id]; reg_file.clear(var.reg, var.rc); + vars.emplace(var.rc.bytes(), id); } return vars; } @@ -1668,8 +1670,8 @@ get_reg(ra_ctx& ctx, RegisterFile& reg_file, Temp temp, /* reallocate passthrough variables and non-killed operands */ std::vector vars; - for (const std::pair& var : find_vars(ctx, reg_file, regs)) - vars.emplace_back(var.second, ctx.assignments[var.second].rc); + for (unsigned id : find_vars(ctx, reg_file, regs)) + vars.emplace_back(id, ctx.assignments[id].rc); vars.emplace_back(0xffffffff, RegClass(info.rc.type(), MAX2(def_size, killed_op_size))); PhysReg space = compact_relocate_vars(ctx, vars, parallelcopies, regs.lo()); -- 2.7.4