r600/sfn: Don't try to re-use iterators when the set is made empty
authorGert Wollny <gert.wollny@collabora.com>
Thu, 30 Nov 2023 12:43:11 +0000 (13:43 +0100)
committerEric Engestrom <eric@engestrom.ch>
Mon, 4 Dec 2023 21:36:35 +0000 (21:36 +0000)
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 <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26420>
(cherry picked from commit c13de0509c43f9b9764dc939aa64fe70c6a80870)

.pick_status.json
src/gallium/drivers/r600/sfn/sfn_optimizer.cpp

index 12fcfdf..6952b34 100644 (file)
         "description": "r600/sfn: Don't try to re-use iterators when the set is made empty",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "05fab97b2ce8ebd8420ded175101a0fa5110172c",
         "notes": null
index c4d0a9f..5038b94 100644 (file)
@@ -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();