aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniel Schürmann <[email protected]>2020-04-14 11:43:39 +0100
committerMarge Bot <[email protected]>2020-04-22 18:23:23 +0000
commit2796cb4c2481c35b9510c03dad3a5ebe65a82d51 (patch)
tree04d35816bda4ec5320a7098f59c1047dc1cbec79 /src
parent6792e134f37323d8b56a60b4620e782fc0d673dd (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')
-rw-r--r--src/amd/compiler/aco_register_allocation.cpp47
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};