diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp index c8bf61cf410..1e1db4c45bc 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.cpp @@ -839,16 +839,14 @@ r600_multislot_get_last_opcode_and_slot(EAluOp opcode, int dest_chan) } } -AluGroup * -AluInstr::split(ValueFactory& vf) +bool +AluInstr::split(ValueFactory& vf, AluGroup& group) { if (m_alu_slots == 1) - return nullptr; + return false; sfn_log << SfnLog::instr << "Split " << *this << "\n"; - auto group = new AluGroup(); - m_dest->del_parent(this); auto [last_opcode, start_slot] = @@ -909,13 +907,12 @@ AluInstr::split(ValueFactory& vf) m_dest->add_parent(instr); sfn_log << SfnLog::instr << " " << *instr << "\n"; - if (!group->add_instruction(instr)) { - std::cerr << "Unable to schedule '" << *instr << "' into\n" << *group << "\n"; - + if (!group.add_instruction(instr)) { + std::cerr << "Unable to schedule '" << *instr << "' into\n" << group << "\n"; UNREACHABLE("Invalid group instruction"); } } - group->set_blockid(block_id(), index()); + group.set_blockid(block_id(), index()); for (auto s : m_src) { auto r = s->as_register(); @@ -923,9 +920,9 @@ AluInstr::split(ValueFactory& vf) r->del_use(this); } } - group->set_origin(this); + set_scheduled(); - return group; + return true; } /* Alu instructions that have SSA dest registers increase the regietsr diff --git a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h index 62f7903e8ab..e9aa70d649f 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instr_alu.h +++ b/src/gallium/drivers/r600/sfn/sfn_instr_alu.h @@ -147,7 +147,7 @@ public: int alu_slots() const { return m_alu_slots; } - AluGroup *split(ValueFactory& vf); + bool split(ValueFactory& vf, AluGroup& dest_group); bool end_group() const override { return m_alu_flags.test(alu_last_instr); } diff --git a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp index b4cd1ab2bde..228fddd23e4 100644 --- a/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_scheduler.cpp @@ -39,8 +39,11 @@ public: else { if (instr->alu_slots() == 1) alu_vec.push_back(instr); - else - alu_groups.push_back(instr->split(m_value_factory)); + else { + auto group = new AluGroup(); + instr->split(m_value_factory, *group); + alu_groups.push_back(group); + } } } void visit(AluGroup *instr) override { alu_groups.push_back(instr); } diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_instr_test.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_instr_test.cpp index c5f7616c5d0..32684a82914 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_instr_test.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_instr_test.cpp @@ -333,9 +333,10 @@ TEST_F(InstrTest, test_alu_dot4_grouped) EXPECT_EQ(alu, alu); ValueFactory vf; - auto group = alu.split(vf); + auto group = new AluGroup(); + bool result = alu.split(vf, *group); group->fix_last_flag(); - ASSERT_TRUE(group); + ASSERT_TRUE(result); auto i = group->begin(); EXPECT_NE(i, group->end());