diff options
author | Daniel Schürmann <[email protected]> | 2020-04-14 11:43:39 +0100 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-04-22 18:23:23 +0000 |
commit | 2796cb4c2481c35b9510c03dad3a5ebe65a82d51 (patch) | |
tree | 04d35816bda4ec5320a7098f59c1047dc1cbec79 /src/amd | |
parent | 6792e134f37323d8b56a60b4620e782fc0d673dd (diff) |
aco: refactor get_reg_simple() to return early on exact matches
in the best fit algorithm
Reviewed-by: Rhys Perry <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4573>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/compiler/aco_register_allocation.cpp | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index a3e01b11c68..11b54ba8339 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -393,7 +393,6 @@ std::pair<PhysReg, bool> get_reg_simple(ra_ctx& ctx, stride = 1; /* stride in full registers */ } - /* best fit algorithm: find the smallest gap to fit in the variable */ if (stride == 1) { if (rc.type() == RegType::vgpr && (size == 4 || size == 8)) { @@ -403,41 +402,39 @@ std::pair<PhysReg, bool> get_reg_simple(ra_ctx& ctx, return res; } + /* best fit algorithm: find the smallest gap to fit in the variable */ unsigned best_pos = 0xFFFF; unsigned gap_size = 0xFFFF; - unsigned next_pos = 0xFFFF; + unsigned last_pos = 0xFFFF; for (unsigned current_reg = lb; current_reg < ub; current_reg++) { - if (reg_file[current_reg] != 0 || ctx.war_hint[current_reg]) { - if (next_pos == 0xFFFF) - continue; - - /* check if the variable fits */ - if (next_pos + size > current_reg) { - next_pos = 0xFFFF; - continue; - } + if (reg_file[current_reg] == 0 && !ctx.war_hint[current_reg]) { + if (last_pos == 0xFFFF) + last_pos = current_reg; + continue; + } - /* check if the tested gap is smaller */ - if (current_reg - next_pos < gap_size) { - best_pos = next_pos; - gap_size = current_reg - next_pos; - } - next_pos = 0xFFFF; + if (last_pos == 0xFFFF) continue; + + /* early return on exact matches */ + if (last_pos + size == current_reg) { + adjust_max_used_regs(ctx, rc, last_pos); + return {PhysReg{last_pos}, true}; } - if (next_pos == 0xFFFF) - next_pos = current_reg; + /* check if it fits and the gap size is smaller */ + if (last_pos + size < current_reg && current_reg - last_pos < gap_size) { + best_pos = last_pos; + gap_size = current_reg - last_pos; + } + last_pos = 0xFFFF; } /* final check */ - if (next_pos != 0xFFFF && - next_pos + size <= ub && - ub - next_pos < gap_size) { - best_pos = next_pos; - gap_size = ub - next_pos; - } + if (last_pos + size <= ub && ub - last_pos < gap_size) + best_pos = last_pos; + if (best_pos != 0xFFFF) { adjust_max_used_regs(ctx, rc, best_pos); return {PhysReg{best_pos}, true}; |