From ac6b95d40bb842eca165c6adaad82632c052dbcc Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Fri, 10 Feb 2023 15:17:11 +0100 Subject: [PATCH] r600/sfn: Work around dependency issue when splitting op to group The instruction that is split may still be referenced as extra dependency in other instructions, so add a handle to the instruction that it can be set to be scheduled. Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp | 1 + src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp | 2 ++ src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h | 3 +++ 3 files changed, 6 insertions(+) diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index 1746a71b985..0508df1bd0b 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -809,6 +809,7 @@ AluInstr::split(ValueFactory& vf) r->del_use(this); } } + group->set_origin(this); return group; } diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp index 60af23739a9..f19b0e28f93 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.cpp @@ -314,6 +314,8 @@ AluGroup::set_scheduled() if (m_slots[i]) m_slots[i]->set_scheduled(); } + if (m_origin) + m_origin->set_scheduled(); } void diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h index 4a2abc154e1..b3906e4a585 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alugroup.h @@ -91,6 +91,8 @@ public: bool addr_for_src() const { return m_addr_for_src; } bool has_kill_op() const { return m_has_kill_op; } + void set_origin(AluInstr *o) { m_origin = o;} + private: void forward_set_blockid(int id, int index) override; bool do_ready() const override; @@ -115,6 +117,7 @@ private: bool m_addr_is_index{false}; bool m_addr_for_src{false}; bool m_has_kill_op{false}; + AluInstr *m_origin{nullptr}; }; } // namespace r600