aco: fix invalid access on Pseudo_instructions
authorDaniel Schürmann <daniel@schuermann.dev>
Fri, 8 Nov 2019 15:36:11 +0000 (16:36 +0100)
committerRhys Perry <pendingchaos02@gmail.com>
Tue, 12 Nov 2019 15:59:48 +0000 (15:59 +0000)
Fixes: 93c8ebfa780ebd1495095e794731881aef29e7d3 aco: Initial commit of independent AMD compiler
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
src/amd/compiler/aco_register_allocation.cpp
src/amd/compiler/aco_spill.cpp

index 9e3d796dc2f55cccd67f40e4cce9408aee8465c3..3b4100cddd296b4181367fa6a6c804879831ac38 100644 (file)
@@ -881,7 +881,15 @@ void handle_pseudo(ra_ctx& ctx,
          break;
       }
    }
-   if (!writes_sgpr)
+   /* if all operands are constant, no need to care either */
+   bool reads_sgpr = false;
+   for (Operand& op : instr->operands) {
+      if (op.isTemp() && op.getTemp().type() == RegType::sgpr) {
+         reads_sgpr = true;
+         break;
+      }
+   }
+   if (!(writes_sgpr && reads_sgpr))
       return;
 
    Pseudo_instruction *pi = (Pseudo_instruction *)instr;
index 276dcbd7c5b5ca363d01bd7c5d964acd48f0879f..952094f40d0f76cf17f6d87f89fae0bb87cf6fbc 100644 (file)
@@ -265,7 +265,7 @@ aco_ptr<Instruction> do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t
       } else if (instr->format == Format::SOP1) {
          res.reset(create_instruction<SOP1_instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
       } else if (instr->format == Format::PSEUDO) {
-         res.reset(create_instruction<Instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
+         res.reset(create_instruction<Pseudo_instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
       }
       for (unsigned i = 0; i < instr->operands.size(); i++) {
          res->operands[i] = instr->operands[i];