From 907dfbea71bbfd92290d1eff1d2f0f7a33b32dc1 Mon Sep 17 00:00:00 2001
From: ameerj <52414509+ameerj@users.noreply.github.com>
Date: Wed, 25 Aug 2021 14:26:49 -0400
Subject: structured_control_flow: Skip reordering nested demote branches.

Nested demote branches add complexity with combining the condition if it has not been initialized yet. Skip them for the time being.
---
 .../frontend/maxwell/structured_control_flow.cpp              | 11 +++++++++++
 1 file changed, 11 insertions(+)

(limited to 'src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp')

diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
index 77d1cd0fc3..69eeaa3e6a 100644
--- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
+++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
@@ -872,10 +872,21 @@ private:
         std::vector<IR::Block*> demote_blocks;
         std::vector<IR::U1> demote_conds;
         u32 num_epilogues{};
+        u32 branch_depth{};
         for (const IR::AbstractSyntaxNode& node : syntax_list) {
+            if (node.type == Type::If) {
+                ++branch_depth;
+            }
+            if (node.type == Type::EndIf) {
+                --branch_depth;
+            }
             if (node.type != Type::Block) {
                 continue;
             }
+            if (branch_depth > 1) {
+                // Skip reordering nested demote branches.
+                continue;
+            }
             for (const IR::Inst& inst : node.data.block->Instructions()) {
                 const IR::Opcode op{inst.GetOpcode()};
                 if (op == IR::Opcode::DemoteToHelperInvocation) {
-- 
cgit v1.2.3-70-g09d2