aco: don't apply sgprs/constants to read/write lane instructions
authorRhys Perry <pendingchaos02@gmail.com>
Tue, 24 Sep 2019 12:32:56 +0000 (13:32 +0100)
committerRhys Perry <pendingchaos02@gmail.com>
Fri, 11 Oct 2019 14:26:58 +0000 (14:26 +0000)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
src/amd/compiler/aco_optimizer.cpp

index fe05634c2807e49af19734576e81579639239ba2..a142ccba9a1c50c768e9ee4a755b01b4175832c0 100644 (file)
@@ -412,6 +412,13 @@ bool can_use_VOP3(aco_ptr<Instruction>& instr)
           instr->opcode != aco_opcode::v_madak_f16;
 }
 
+bool can_apply_sgprs(aco_ptr<Instruction>& instr)
+{
+   return instr->opcode != aco_opcode::v_readfirstlane_b32 &&
+          instr->opcode != aco_opcode::v_readlane_b32 &&
+          instr->opcode != aco_opcode::v_writelane_b32;
+}
+
 void to_VOP3(opt_ctx& ctx, aco_ptr<Instruction>& instr)
 {
    if (instr->isVOP3())
@@ -452,6 +459,8 @@ bool can_accept_constant(aco_ptr<Instruction>& instr, unsigned operand)
    case aco_opcode::p_wqm:
    case aco_opcode::p_extract_vector:
    case aco_opcode::p_split_vector:
+   case aco_opcode::v_readlane_b32:
+   case aco_opcode::v_readfirstlane_b32:
       return operand != 0;
    default:
       if ((instr->format == Format::MUBUF ||
@@ -1970,7 +1979,8 @@ void combine_instruction(opt_ctx &ctx, aco_ptr<Instruction>& instr)
       return;
 
    if (instr->isVALU()) {
-      apply_sgprs(ctx, instr);
+      if (can_apply_sgprs(instr))
+         apply_sgprs(ctx, instr);
       if (apply_omod_clamp(ctx, instr))
          return;
    }