aboutsummaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2021-08-25 14:26:49 -0400
committerameerj <52414509+ameerj@users.noreply.github.com>2021-08-30 11:46:25 -0400
commit907dfbea71bbfd92290d1eff1d2f0f7a33b32dc1 (patch)
tree03d206644462b28e726a66a52ff17df41f96598b /src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
parent4fda7f1c821e1000210b1dfdf1074795b1aa9d96 (diff)
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.
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp')
-rw-r--r--src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp11
1 files changed, 11 insertions, 0 deletions
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) {