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

Author: Gert Wollny <[email protected]>
Date:   Thu Nov 30 13:43:11 2023 +0100

r600/sfn: Don't try to re-use iterators when the set is made empty

It seems with libc++ the iterators are invalidated when the set
is emptied during iterating over it.

Fixes: 05fab97 (r600/sfn: Don't try to re-use the iterator when uses is updated)

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7931

Signed-off-by: Gert Wollny <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26420>

---

 src/gallium/drivers/r600/sfn/sfn_optimizer.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/r600/sfn/sfn_optimizer.cpp 
b/src/gallium/drivers/r600/sfn/sfn_optimizer.cpp
index c4d0a9fa727..5038b94ab6e 100644
--- a/src/gallium/drivers/r600/sfn/sfn_optimizer.cpp
+++ b/src/gallium/drivers/r600/sfn/sfn_optimizer.cpp
@@ -375,7 +375,11 @@ CopyPropFwdVisitor::visit(AluInstr *instr)
 
    auto mov_block_id = instr->block_id();
 
-   while(ii != ie) {
+   /** libc++ seems to invalidate the end iterator too if a std::set is
+    *  made empty by an erase operation,
+    *  https://gitlab.freedesktop.org/mesa/mesa/-/issues/7931
+    */
+   while(ii != ie && !dest->uses().empty()) {
       auto i = *ii;
       auto target_block_id = i->block_id();
 

Reply via email to