aboutsummaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-03-27 02:54:32 -0300
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-22 21:51:24 -0400
commita806b29cb9bb48c4a9628700946231c9150463b5 (patch)
tree334b292d73c9404a84d0bc719df4bea45e61530f /src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
parentcdf0cc38698bf31773edd0016d5171bd11b966d0 (diff)
shader: Fix structured control flow on KIL instructions
This could potentially leave unvisited blocks, leading to illegal phi nodes.
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp')
-rw-r--r--src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
index 79e3449863..9d46883902 100644
--- a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
+++ b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
@@ -152,7 +152,9 @@ std::string DumpTree(const Tree& tree, u32 indentation = 0) {
for (auto stmt = tree.begin(); stmt != tree.end(); ++stmt) {
switch (stmt->type) {
case StatementType::Code:
- ret += fmt::format("{} Block {:04x};\n", indent, stmt->code->LocationBegin());
+ ret += fmt::format("{} Block {:04x} -> {:04x} (0x{:016x});\n", indent,
+ stmt->code->LocationBegin(), stmt->code->LocationEnd(),
+ reinterpret_cast<uintptr_t>(stmt->code));
break;
case StatementType::Goto:
ret += fmt::format("{} if ({}) goto L{};\n", indent, DumpExpr(stmt->cond),
@@ -749,8 +751,9 @@ private:
current_block = block_pool.Create(inst_pool);
block_list.push_back(current_block);
}
- IR::IREmitter{*current_block}.DemoteToHelperInvocation(continue_block);
- current_block = nullptr;
+ IR::Block* demote_block{MergeBlock(parent, stmt)};
+ IR::IREmitter{*current_block}.DemoteToHelperInvocation(demote_block);
+ current_block = demote_block;
break;
}
default: