summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/shader_recompiler/frontend/ir/ir_emitter.cpp1
-rw-r--r--src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp9
2 files changed, 7 insertions, 3 deletions
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
index f281c023f..82613f607 100644
--- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp
+++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp
@@ -83,6 +83,7 @@ void IREmitter::SelectionMerge(Block* merge_block) {
}
void IREmitter::Return() {
+ block->SetReturn();
Inst(Opcode::Return);
}
diff --git a/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp b/src/shader_recompiler/frontend/maxwell/structured_control_flow.cpp
index 79e344986..9d4688390 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: