From 8f3e298a588b1027c8d7ce30d2eb457e507eb8bb Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Thu, 6 Jul 2023 21:29:53 +0200 Subject: [PATCH] r600/sfn: Shorten array elements live range If an array is accessed indirectly, add a buffer live range of one cycle before (for write) or after (for read), instead of pinning the array from the start. Signed-off-by: Gert Wollny Part-of: --- src/gallium/drivers/r600/sfn/sfn_liverangeevaluator.cpp | 4 ++-- src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp | 7 ------- src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp | 8 ++++---- src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp | 8 ++++---- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_liverangeevaluator.cpp b/src/gallium/drivers/r600/sfn/sfn_liverangeevaluator.cpp index 6b4964b5d8c..f2cc60ef462 100644 --- a/src/gallium/drivers/r600/sfn/sfn_liverangeevaluator.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_liverangeevaluator.cpp @@ -445,7 +445,7 @@ LiveRangeInstrVisitor::record_write(const Register *reg) for (auto i = 0u; i < array.size(); ++i) { auto& rav = m_register_access(array(i, reg->chan())); - rav.record_write(m_line, m_current_scope); + rav.record_write(m_line > 0 ? m_line - 1 : 0, m_current_scope); } } else { auto& ra = m_register_access(*reg); @@ -476,7 +476,7 @@ LiveRangeInstrVisitor::record_read(const Register *reg, LiveRangeEntry::EUse use for (auto i = 0u; i < array.size(); ++i) { auto& rav = m_register_access(array(i, reg->chan())); - rav.record_read(m_line, m_current_scope, use); + rav.record_read(m_line + 1, m_current_scope, use); } } else { sfn_log << SfnLog::merge << *reg << " read:" << m_line << "\n"; diff --git a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp index c863738c95c..019938f4b8a 100644 --- a/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_virtualvalues.cpp @@ -877,13 +877,6 @@ LocalArray::LocalArray(int base_sel, int nchannels, int size, int frac): for (unsigned i = 0; i < m_size; ++i) { PRegister reg = new Register(base_sel + i, c + frac, pin_array); m_values[m_size * c + i] = new LocalArrayValue(reg, *this); - - /* Pin the array register on the start, because currently we don't - * don't track the first write to an array element as write to all - * array elements, and it seems that the one can not just use - * registers that are not written to in an array for other purpouses - */ - m_values[m_size * c + i]->set_flag(Register::pin_start); } } } diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp index 2cbdb89b59d..d3c10b51373 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_liverange_test.cpp @@ -171,11 +171,11 @@ TEST_F(LiveRangeTests, SimpleArrayAccess) LiveRangeMap expect = vf.prepare_live_range_map(); - expect.set_life_range(*array->element(0, nullptr, 0), 0, 5); - expect.set_life_range(*array->element(0, nullptr, 1), 0, 5); - expect.set_life_range(*array->element(1, nullptr, 0), 0, 5); + expect.set_life_range(*array->element(0, nullptr, 0), 1, 5); + expect.set_life_range(*array->element(0, nullptr, 1), 1, 5); + expect.set_life_range(*array->element(1, nullptr, 0), 1, 4); - expect.set_life_range(*array->element(1, nullptr, 1), 0, 5); + expect.set_life_range(*array->element(1, nullptr, 1), 2, 4); expect.set_life_range(*s1, 2, 3); diff --git a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp index a32e0be177a..1c2c2b7cd7e 100644 --- a/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp +++ b/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp @@ -2152,12 +2152,12 @@ ALU_GROUP_BEGIN ALU MOV A0[AR].y : L[2.0] {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MOV R2.x : A0[0].x {W} - ALU MOV R2.y : A0[0].y {WL} + ALU MOV R1.x : A0[0].x {W} + ALU MOV R1.y : A0[0].y {WL} ALU_GROUP_END ALU_GROUP_BEGIN - ALU MUL_IEEE R0.x : R2.x KC0[2].y {W} - ALU MUL_IEEE R0.y : R2.y KC0[2].y {WL} + ALU MUL_IEEE R0.x : R1.x KC0[2].y {W} + ALU MUL_IEEE R0.y : R1.y KC0[2].y {WL} ALU_GROUP_END BLOCK_END BLOCK_START