Mesa (main): aco/scheduler: Clean up register demand tracking

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 7 10:26:12 UTC 2021


Module: Mesa
Branch: main
Commit: 81761a311e1af3ca91b3c45d7031bacd2d78cb6e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=81761a311e1af3ca91b3c45d7031bacd2d78cb6e

Author: Tony Wasserka <tony.wasserka at gmx.de>
Date:   Mon May 10 11:54:21 2021 +0200

aco/scheduler: Clean up register demand tracking

Refactoring total_demand and total_demand_clause to cover non-overlapping
instruction intervals makes the code easier to follow and allows the register
demand to be updated more efficiently in some cases.

Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10885>

---

 src/amd/compiler/aco_scheduler.cpp | 55 +++++++++++++++++++++-----------------
 1 file changed, 30 insertions(+), 25 deletions(-)

diff --git a/src/amd/compiler/aco_scheduler.cpp b/src/amd/compiler/aco_scheduler.cpp
index 4f87121eddf..f2a13eac892 100644
--- a/src/amd/compiler/aco_scheduler.cpp
+++ b/src/amd/compiler/aco_scheduler.cpp
@@ -64,7 +64,7 @@ struct MoveState {
 
    int source_idx;
    int insert_idx, insert_idx_clause;
-   RegisterDemand total_demand, total_demand_clause;
+   RegisterDemand clause_demand, total_demand;
 
    /* for moving instructions before the current instruction to after it */
    void downwards_init(int current_idx, bool improved_rar, bool may_form_clauses);
@@ -125,12 +125,13 @@ void MoveState::downwards_advance_helper()
    for (int i = source_idx + 1; i < insert_idx_clause; ++i) {
       reference_demand.update(register_demand[i]);
    }
-   assert(total_demand_clause == reference_demand);
+   assert(total_demand == reference_demand);
 
+   reference_demand = {};
    for (int i = insert_idx_clause; i < insert_idx; ++i) {
       reference_demand.update(register_demand[i]);
    }
-   assert(total_demand == reference_demand);
+   assert(clause_demand == reference_demand);
 #endif
 }
 
@@ -142,8 +143,8 @@ void MoveState::downwards_init(int current_idx, bool improved_rar_, bool may_for
    insert_idx = current_idx + 1;
    insert_idx_clause = current_idx;
 
-   total_demand = register_demand[current_idx];
-   total_demand_clause = {};
+   clause_demand = register_demand[current_idx];
+   total_demand = {};
 
    std::fill(depends_on.begin(), depends_on.end(), false);
    if (improved_rar) {
@@ -164,7 +165,10 @@ void MoveState::downwards_init(int current_idx, bool improved_rar_, bool may_for
    downwards_advance_helper();
 }
 
-MoveResult MoveState::downwards_move(bool clause)
+/* If add_to_clause is true, the current clause is extended by moving the
+ * instruction at source_idx in front of the clause. Otherwise, the instruction
+ * is moved past the end of the clause without extending it */
+MoveResult MoveState::downwards_move(bool add_to_clause)
 {
    aco_ptr<Instruction>& instr = block->instructions[source_idx];
 
@@ -173,7 +177,7 @@ MoveResult MoveState::downwards_move(bool clause)
          return move_fail_ssa;
 
    /* check if one of candidate's operands is killed by depending instruction */
-   std::vector<bool>& RAR_deps = improved_rar ? (clause ? RAR_dependencies_clause : RAR_dependencies) : depends_on;
+   std::vector<bool>& RAR_deps = improved_rar ? (add_to_clause ? RAR_dependencies_clause : RAR_dependencies) : depends_on;
    for (const Operand& op : instr->operands) {
       if (op.isTemp() && RAR_deps[op.tempId()]) {
          // FIXME: account for difference in register pressure
@@ -181,7 +185,7 @@ MoveResult MoveState::downwards_move(bool clause)
       }
    }
 
-   if (clause) {
+   if (add_to_clause) {
       for (const Operand& op : instr->operands) {
          if (op.isTemp()) {
             depends_on[op.tempId()] = true;
@@ -191,13 +195,19 @@ MoveResult MoveState::downwards_move(bool clause)
       }
    }
 
-   const int dest_insert_idx = clause ? insert_idx_clause : insert_idx;
-   const RegisterDemand register_pressure = clause ? total_demand_clause : total_demand;
+   const int dest_insert_idx = add_to_clause ? insert_idx_clause : insert_idx;
+   RegisterDemand register_pressure = total_demand;
+   if (!add_to_clause) {
+      register_pressure.update(clause_demand);
+   }
 
+   /* Check the new demand of the instructions being moved over */
    const RegisterDemand candidate_diff = get_live_changes(instr);
-   const RegisterDemand temp = get_temp_registers(instr);
    if (RegisterDemand(register_pressure - candidate_diff).exceeds(max_registers))
       return move_fail_pressure;
+
+   /* New demand for the moved instruction */
+   const RegisterDemand temp = get_temp_registers(instr);
    const RegisterDemand temp2 = get_temp_registers(block->instructions[dest_insert_idx - 1]);
    const RegisterDemand new_demand = register_demand[dest_insert_idx - 1] - temp2 + temp;
    if (new_demand.exceeds(max_registers))
@@ -212,21 +222,17 @@ MoveResult MoveState::downwards_move(bool clause)
       register_demand[i] -= candidate_diff;
    register_demand[dest_insert_idx - 1] = new_demand;
    insert_idx_clause--;
-   total_demand_clause -= candidate_diff;
-   if (source_idx == insert_idx_clause) {
-      total_demand_clause = RegisterDemand{};
-   }
-   if (!clause) {
+   if (source_idx != insert_idx_clause) {
+      /* Update demand if we moved over any instructions before the clause */
       total_demand -= candidate_diff;
-      insert_idx--;
    } else {
-      /* The local demand of clause instructions did not change. But if
-       * previously total_demand_clause was greater than or equal to
-       * total_demand, the global maximum may have changed still */
-      total_demand = total_demand_clause;
-      for (int i = insert_idx_clause; i < insert_idx; ++i) {
-         total_demand.update(register_demand[i]);
-      }
+      assert(total_demand == RegisterDemand{});
+   }
+   if (add_to_clause) {
+      clause_demand.update(new_demand);
+   } else {
+      clause_demand -= candidate_diff;
+      insert_idx--;
    }
 
    downwards_advance_helper();
@@ -246,7 +252,6 @@ void MoveState::downwards_skip()
          }
       }
    }
-   total_demand_clause.update(register_demand[source_idx]);
    total_demand.update(register_demand[source_idx]);
 
    downwards_advance_helper();



More information about the mesa-commit mailing list