Преглед изворни кода

shader: Remove invalidated blocks in dead code elimination pass

ReinUsesLisp пре 5 година
родитељ
комит
92a01984e6
1 измењених фајлова са 6 додато и 3 уклоњено
  1. 6 3
      src/shader_recompiler/ir_opt/dead_code_elimination_pass.cpp

+ 6 - 3
src/shader_recompiler/ir_opt/dead_code_elimination_pass.cpp

@@ -14,9 +14,12 @@ void DeadCodeEliminationPass(IR::Program& program) {
     // We iterate over the instructions in reverse order.
     // This is because removing an instruction reduces the number of uses for earlier instructions.
     for (IR::Block* const block : program.post_order_blocks) {
-        for (IR::Inst& inst : block->Instructions() | std::views::reverse) {
-            if (!inst.HasUses() && !inst.MayHaveSideEffects()) {
-                inst.Invalidate();
+        auto it{block->end()};
+        while (it != block->begin()) {
+            --it;
+            if (!it->HasUses() && !it->MayHaveSideEffects()) {
+                it->Invalidate();
+                it = block->Instructions().erase(it);
             }
         }
     }