Просмотр исходного кода

shader: Reorder phi nodes when redefined as undefined opcodes

ReinUsesLisp 5 лет назад
Родитель
Сommit
32b6c63485
1 измененных файлов с 9 добавлено и 1 удалено
  1. 9 1
      src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp

+ 9 - 1
src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp

@@ -181,8 +181,16 @@ private:
         }
         if (same.IsEmpty()) {
             // The phi is unreachable or in the start block
-            const auto first_not_phi{std::ranges::find_if_not(block->Instructions(), IsPhi)};
+            // First remove the phi node from the block, it will be reinserted
+            IR::Block::InstructionList& list{block->Instructions()};
+            list.erase(IR::Block::InstructionList::s_iterator_to(phi));
+
+            // Insert an undef instruction after all phi nodes (to keep phi instructions on top)
+            const auto first_not_phi{std::ranges::find_if_not(list, IsPhi)};
             same = IR::Value{&*block->PrependNewInst(first_not_phi, undef_opcode)};
+
+            // Insert the phi node after the undef opcode, this will be replaced with an identity
+            list.insert(first_not_phi, phi);
         }
         // Reroute all uses of phi to same and remove phi
         phi.ReplaceUsesWith(same);