Mesa (main): aco/optimizer: apply extract from p_extract_vector

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 31 15:13:09 UTC 2021


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

Author: Daniel Schürmann <daniel at schuermann.dev>
Date:   Mon Oct  4 11:13:08 2021 +0100

aco/optimizer: apply extract from p_extract_vector

Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13576>

---

 src/amd/compiler/aco_optimizer.cpp | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp
index 1e314ed9550..bc842a58906 100644
--- a/src/amd/compiler/aco_optimizer.cpp
+++ b/src/amd/compiler/aco_optimizer.cpp
@@ -942,9 +942,14 @@ parse_extract(Instruction* instr)
       return SubdwordSel(size, offset, sext);
    } else if (instr->opcode == aco_opcode::p_insert && instr->operands[1].constantEquals(0)) {
       return instr->operands[2].constantEquals(8) ? SubdwordSel::ubyte : SubdwordSel::uword;
-   } else {
-      return SubdwordSel();
+   } else if (instr->opcode == aco_opcode::p_extract_vector) {
+      unsigned size = instr->definitions[0].bytes();
+      unsigned offset = instr->operands[1].constantValue() * size;
+      if (size <= 2)
+         return SubdwordSel(size, offset, false);
    }
+
+   return SubdwordSel();
 }
 
 SubdwordSel
@@ -1482,12 +1487,18 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
          instr->operands[0] =
             Operand::get_const(ctx.program->chip_class, val, instr->definitions[0].bytes());
          ;
-      } else if (index == 0 && instr->operands[0].size() == instr->definitions[0].size()) {
-         ctx.info[instr->definitions[0].tempId()].set_temp(instr->operands[0].getTemp());
       }
 
-      if (instr->operands[0].bytes() != instr->definitions[0].bytes())
+      if (instr->operands[0].bytes() != instr->definitions[0].bytes()) {
+         if (instr->operands[0].size() != 1)
+            break;
+
+         if (index == 0)
+            ctx.info[instr->definitions[0].tempId()].set_temp(instr->operands[0].getTemp());
+         else
+            ctx.info[instr->definitions[0].tempId()].set_extract(instr.get());
          break;
+      }
 
       /* convert this extract into a copy instruction */
       instr->opcode = aco_opcode::p_parallelcopy;



More information about the mesa-commit mailing list