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

Author: Timur Kristóf <[email protected]>
Date:   Thu May 13 20:43:28 2021 +0200

aco: Refactor SSA elimination phi info to use vector instead of map.

No Fossil DB changes.

Signed-off-by: Timur Kristóf <[email protected]>
Reviewed-by: Tony Wasserka <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10691>

---

 src/amd/compiler/aco_ssa_elimination.cpp | 60 ++++++++++++++++++++------------
 1 file changed, 38 insertions(+), 22 deletions(-)

diff --git a/src/amd/compiler/aco_ssa_elimination.cpp 
b/src/amd/compiler/aco_ssa_elimination.cpp
index 057028486c8..f4884a42875 100644
--- a/src/amd/compiler/aco_ssa_elimination.cpp
+++ b/src/amd/compiler/aco_ssa_elimination.cpp
@@ -30,16 +30,23 @@
 namespace aco {
 namespace {
 
-/* map: block-id -> pair (dest, src) to store phi information */
-typedef std::map<uint32_t, std::vector<std::pair<Definition, Operand>>> 
phi_info;
+struct phi_info_item {
+   Definition def;
+   Operand op;
+};
 
 struct ssa_elimination_ctx {
-   phi_info logical_phi_info;
-   phi_info linear_phi_info;
+   /* The outer vectors should be indexed by block index. The inner vectors 
store phi information for each block. */
+   std::vector<std::vector<phi_info_item>> logical_phi_info;
+   std::vector<std::vector<phi_info_item>> linear_phi_info;
    std::vector<bool> empty_blocks;
    Program* program;
 
-   ssa_elimination_ctx(Program* program_) : 
empty_blocks(program_->blocks.size(), true), program(program_) {}
+   ssa_elimination_ctx(Program* program_)
+      : logical_phi_info(program_->blocks.size())
+      , linear_phi_info(program_->blocks.size())
+      , empty_blocks(program_->blocks.size(), true)
+      , program(program_) {}
 };
 
 void collect_phi_info(ssa_elimination_ctx& ctx)
@@ -55,12 +62,13 @@ void collect_phi_info(ssa_elimination_ctx& ctx)
             if (phi->operands[i].physReg() == phi->definitions[0].physReg())
                continue;
 
-            std::vector<unsigned>& preds = phi->opcode == aco_opcode::p_phi ? 
block.logical_preds : block.linear_preds;
-            phi_info& info = phi->opcode == aco_opcode::p_phi ? 
ctx.logical_phi_info : ctx.linear_phi_info;
-            const auto result = info.emplace(preds[i], 
std::vector<std::pair<Definition, Operand>>());
             assert(phi->definitions[0].size() == phi->operands[i].size());
-            result.first->second.emplace_back(phi->definitions[0], 
phi->operands[i]);
-            ctx.empty_blocks[preds[i]] = false;
+
+            std::vector<unsigned>& preds = phi->opcode == aco_opcode::p_phi ? 
block.logical_preds : block.linear_preds;
+            uint32_t pred_idx = preds[i];
+            auto& info_vec = phi->opcode == aco_opcode::p_phi ? 
ctx.logical_phi_info[pred_idx] : ctx.linear_phi_info[pred_idx];
+            info_vec.push_back({phi->definitions[0], phi->operands[i]});
+            ctx.empty_blocks[pred_idx] = false;
          }
       }
    }
@@ -69,8 +77,12 @@ void collect_phi_info(ssa_elimination_ctx& ctx)
 void insert_parallelcopies(ssa_elimination_ctx& ctx)
 {
    /* insert the parallelcopies from logical phis before p_logical_end */
-   for (auto&& entry : ctx.logical_phi_info) {
-      Block& block = ctx.program->blocks[entry.first];
+   for (unsigned block_idx = 0; block_idx < ctx.program->blocks.size(); 
++block_idx) {
+      auto &logical_phi_info = ctx.logical_phi_info[block_idx];
+      if (logical_phi_info.empty())
+         continue;
+
+      Block& block = ctx.program->blocks[block_idx];
       unsigned idx = block.instructions.size() - 1;
       while (block.instructions[idx]->opcode != aco_opcode::p_logical_end) {
          assert(idx > 0);
@@ -78,12 +90,12 @@ void insert_parallelcopies(ssa_elimination_ctx& ctx)
       }
 
       std::vector<aco_ptr<Instruction>>::iterator it = 
std::next(block.instructions.begin(), idx);
-      aco_ptr<Pseudo_instruction> 
pc{create_instruction<Pseudo_instruction>(aco_opcode::p_parallelcopy, 
Format::PSEUDO, entry.second.size(), entry.second.size())};
+      aco_ptr<Pseudo_instruction> 
pc{create_instruction<Pseudo_instruction>(aco_opcode::p_parallelcopy, 
Format::PSEUDO, logical_phi_info.size(), logical_phi_info.size())};
       unsigned i = 0;
-      for (std::pair<Definition, Operand>& pair : entry.second)
+      for (auto& phi_info : logical_phi_info)
       {
-         pc->definitions[i] = pair.first;
-         pc->operands[i] = pair.second;
+         pc->definitions[i] = phi_info.def;
+         pc->operands[i] = phi_info.op;
          i++;
       }
       /* this shouldn't be needed since we're only copying vgprs */
@@ -92,17 +104,21 @@ void insert_parallelcopies(ssa_elimination_ctx& ctx)
    }
 
    /* insert parallelcopies for the linear phis at the end of blocks just 
before the branch */
-   for (auto&& entry : ctx.linear_phi_info) {
-      Block& block = ctx.program->blocks[entry.first];
+   for (unsigned block_idx = 0; block_idx < ctx.program->blocks.size(); 
++block_idx) {
+      auto &linear_phi_info = ctx.linear_phi_info[block_idx];
+      if (linear_phi_info.empty())
+         continue;
+
+      Block& block = ctx.program->blocks[block_idx];
       std::vector<aco_ptr<Instruction>>::iterator it = 
block.instructions.end();
       --it;
       assert((*it)->isBranch());
-      aco_ptr<Pseudo_instruction> 
pc{create_instruction<Pseudo_instruction>(aco_opcode::p_parallelcopy, 
Format::PSEUDO, entry.second.size(), entry.second.size())};
+      aco_ptr<Pseudo_instruction> 
pc{create_instruction<Pseudo_instruction>(aco_opcode::p_parallelcopy, 
Format::PSEUDO, linear_phi_info.size(), linear_phi_info.size())};
       unsigned i = 0;
-      for (std::pair<Definition, Operand>& pair : entry.second)
+      for (auto& phi_info : linear_phi_info)
       {
-         pc->definitions[i] = pair.first;
-         pc->operands[i] = pair.second;
+         pc->definitions[i] = phi_info.def;
+         pc->operands[i] = phi_info.op;
          i++;
       }
       pc->tmp_in_scc = block.scc_live_out;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to