From 7496bbf7584049fb9c99cf705e9cc16aee61a55a Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Wed, 24 Feb 2021 18:31:32 -0300
Subject: spirv: Add support for self-referencing phi nodes

---
 src/shader_recompiler/backend/spirv/emit_spirv.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

(limited to 'src/shader_recompiler/backend/spirv/emit_spirv.cpp')

diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index f3aca90d06..bcd6bda28b 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -217,9 +217,16 @@ Id EmitPhi(EmitContext& ctx, IR::Inst* inst) {
             IR::Inst* const arg_inst{arg.Inst()};
             def = arg_inst->Definition<Id>();
             if (!Sirit::ValidId(def)) {
-                // If it hasn't been defined, get a forward declaration
-                def = ctx.ForwardDeclarationId();
-                arg_inst->SetDefinition<Id>(def);
+                if (arg_inst == inst) {
+                    // This is a self referencing phi node
+                    def = ctx.CurrentId();
+                    // Self-referencing definition will be set by the caller
+                } else {
+                    // If it hasn't been defined and it's not a self reference,
+                    // get a forward declaration
+                    def = ctx.ForwardDeclarationId();
+                    arg_inst->SetDefinition<Id>(def);
+                }
             }
         }
         IR::Block* const phi_block{inst->PhiBlock(index)};
-- 
cgit v1.2.3-70-g09d2