aco: fix validation of sub-dword parallel-copies

Only the operands with a sub-dword definition need to be checked.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6662>
diff --git a/src/amd/compiler/aco_validate.cpp b/src/amd/compiler/aco_validate.cpp
index fce0e1a..02852d6 100644
--- a/src/amd/compiler/aco_validate.cpp
+++ b/src/amd/compiler/aco_validate.cpp
@@ -323,23 +323,34 @@
 
          switch (instr->format) {
          case Format::PSEUDO: {
-            bool is_subdword = false;
-            bool has_const_sgpr = false;
-            bool has_literal = false;
-            for (Definition def : instr->definitions)
-               is_subdword |= def.regClass().is_subdword();
-            for (unsigned i = 0; i < instr->operands.size(); i++) {
-               if (instr->opcode == aco_opcode::p_extract_vector && i == 1)
-                  continue;
-               Operand op = instr->operands[i];
-               is_subdword |= op.hasRegClass() && op.regClass().is_subdword();
-               has_const_sgpr |= op.isConstant() || (op.hasRegClass() && op.regClass().type() == RegType::sgpr);
-               has_literal |= op.isLiteral();
-            }
+            if (instr->opcode == aco_opcode::p_parallelcopy) {
+               for (unsigned i = 0; i < instr->operands.size(); i++) {
+                  if (!instr->definitions[i].regClass().is_subdword())
+                     continue;
+                  Operand op = instr->operands[i];
+                  check(!op.isLiteral(), "Sub-dword copies cannot take literals", instr.get());
+                  if (op.isConstant() || (op.hasRegClass() && op.regClass().type() == RegType::sgpr))
+                     check(program->chip_class >= GFX9, "Sub-dword pseudo instructions can only take constants or SGPRs on GFX9+", instr.get());
+               }
+            } else {
+               bool is_subdword = false;
+               bool has_const_sgpr = false;
+               bool has_literal = false;
+               for (Definition def : instr->definitions)
+                  is_subdword |= def.regClass().is_subdword();
+               for (unsigned i = 0; i < instr->operands.size(); i++) {
+                  if (instr->opcode == aco_opcode::p_extract_vector && i == 1)
+                     continue;
+                  Operand op = instr->operands[i];
+                  is_subdword |= op.hasRegClass() && op.regClass().is_subdword();
+                  has_const_sgpr |= op.isConstant() || (op.hasRegClass() && op.regClass().type() == RegType::sgpr);
+                  has_literal |= op.isLiteral();
+               }
 
-            check(!is_subdword || !has_const_sgpr || program->chip_class >= GFX9,
-                  "Sub-dword pseudo instructions can only take constants or SGPRs on GFX9+", instr.get());
-            check(!is_subdword || !has_literal, "Sub-dword pseudo instructions cannot take literals", instr.get());
+               check(!is_subdword || !has_const_sgpr || program->chip_class >= GFX9,
+                     "Sub-dword pseudo instructions can only take constants or SGPRs on GFX9+", instr.get());
+               check(!is_subdword || !has_literal, "Sub-dword pseudo instructions cannot take literals", instr.get());
+            }
 
             if (instr->opcode == aco_opcode::p_create_vector) {
                unsigned size = 0;