Mesa (main): r600/sfn: Don't read return values of atomic ops that are not used

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 17 11:05:57 UTC 2021


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

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Sun Jun 13 14:36:13 2021 +0200

r600/sfn: Don't read return values of atomic ops that are not used

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11348>

---

 .../drivers/r600/sfn/sfn_emitssboinstruction.cpp   | 52 +++++++++++++++++++---
 .../drivers/r600/sfn/sfn_emitssboinstruction.h     |  4 +-
 2 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
index fdeb82e667d..40f2730db56 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.cpp
@@ -112,12 +112,17 @@ bool EmitSSBOInstruction::do_emit(nir_instr* instr)
 
 bool EmitSSBOInstruction::emit_atomic(const nir_intrinsic_instr* instr)
 {
-   ESDOp op = get_opcode(instr->intrinsic);
+   bool read_result = !instr->dest.is_ssa || !list_is_empty(&instr->dest.ssa.uses);
+
+   ESDOp op = read_result ? get_opcode(instr->intrinsic) :
+                            get_opcode_wo(instr->intrinsic);
 
    if (DS_OP_INVALID == op)
       return false;
 
-   GPRVector dest = make_dest(instr);
+
+
+   GPRVector dest = read_result ? make_dest(instr) : GPRVector(0, {7,7,7,7});
 
    int base = remap_atomic_base(nir_intrinsic_base(instr));
 
@@ -139,12 +144,14 @@ bool EmitSSBOInstruction::emit_atomic(const nir_intrinsic_instr* instr)
 
 bool EmitSSBOInstruction::emit_unary_atomic(const nir_intrinsic_instr* instr)
 {
-   ESDOp op = get_opcode(instr->intrinsic);
+   bool read_result = !instr->dest.is_ssa || !list_is_empty(&instr->dest.ssa.uses);
+
+   ESDOp op = read_result ? get_opcode(instr->intrinsic) : get_opcode_wo(instr->intrinsic);
 
    if (DS_OP_INVALID == op)
       return false;
 
-   GPRVector dest = make_dest(instr);
+   GPRVector dest = read_result ? make_dest(instr) : GPRVector(0, {7,7,7,7});
 
    PValue uav_id = from_nir(instr->src[0], 0);
 
@@ -154,7 +161,7 @@ bool EmitSSBOInstruction::emit_unary_atomic(const nir_intrinsic_instr* instr)
    return true;
 }
 
-ESDOp EmitSSBOInstruction::get_opcode(const nir_intrinsic_op opcode)
+ESDOp EmitSSBOInstruction::get_opcode(const nir_intrinsic_op opcode) const
 {
    switch (opcode) {
    case nir_intrinsic_atomic_counter_add:
@@ -185,6 +192,35 @@ ESDOp EmitSSBOInstruction::get_opcode(const nir_intrinsic_op opcode)
    }
 }
 
+ESDOp EmitSSBOInstruction::get_opcode_wo(const nir_intrinsic_op opcode) const
+{
+   switch (opcode) {
+   case nir_intrinsic_atomic_counter_add:
+      return DS_OP_ADD;
+   case nir_intrinsic_atomic_counter_and:
+      return DS_OP_AND;
+   case nir_intrinsic_atomic_counter_inc:
+      return DS_OP_INC;
+   case nir_intrinsic_atomic_counter_max:
+      return DS_OP_MAX_UINT;
+   case nir_intrinsic_atomic_counter_min:
+      return DS_OP_MIN_UINT;
+   case nir_intrinsic_atomic_counter_or:
+      return DS_OP_OR;
+   case nir_intrinsic_atomic_counter_xor:
+      return DS_OP_XOR;
+   case nir_intrinsic_atomic_counter_post_dec:
+      return DS_OP_DEC;
+   case nir_intrinsic_atomic_counter_comp_swap:
+      return DS_OP_CMP_XCHG_RET;
+   case nir_intrinsic_atomic_counter_exchange:
+      return DS_OP_XCHG_RET;
+   case nir_intrinsic_atomic_counter_pre_dec:
+   default:
+      return DS_OP_INVALID;
+   }
+}
+
 RatInstruction::ERatOp
 EmitSSBOInstruction::get_rat_opcode(const nir_intrinsic_op opcode, pipe_format format) const
 {
@@ -279,9 +315,11 @@ bool EmitSSBOInstruction::load_atomic_inc_limits()
 
 bool EmitSSBOInstruction::emit_atomic_inc(const nir_intrinsic_instr* instr)
 {
+   bool read_result = !instr->dest.is_ssa || !list_is_empty(&instr->dest.ssa.uses);
    PValue uav_id = from_nir(instr->src[0], 0);
-   GPRVector dest = make_dest(instr);
-   auto ir = new GDSInstr(DS_OP_ADD_RET, dest, m_atomic_update, uav_id,
+   GPRVector dest = read_result ? make_dest(instr): GPRVector(0, {7,7,7,7});
+   auto ir = new GDSInstr(read_result ? DS_OP_ADD_RET : DS_OP_ADD, dest,
+                          m_atomic_update, uav_id,
                           remap_atomic_base(nir_intrinsic_base(instr)));
    emit_instruction(ir);
    return true;
diff --git a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.h b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.h
index 552f1249aad..4d5fa0fb62e 100644
--- a/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.h
+++ b/src/gallium/drivers/r600/sfn/sfn_emitssboinstruction.h
@@ -38,7 +38,9 @@ private:
 
    bool make_stores_ack_and_waitack();
 
-   ESDOp get_opcode(nir_intrinsic_op opcode);
+   ESDOp get_opcode(nir_intrinsic_op opcode) const;
+   ESDOp get_opcode_wo(const nir_intrinsic_op opcode) const;
+
    RatInstruction::ERatOp get_rat_opcode(const nir_intrinsic_op opcode, pipe_format format) const;
    RatInstruction::ERatOp get_rat_opcode_wo(const nir_intrinsic_op opcode, pipe_format format) const;
 



More information about the mesa-commit mailing list