Przeglądaj źródła

shader: Fix structured control flow on KIL instructions

This could potentially leave unvisited blocks, leading to illegal phi
nodes.
ReinUsesLisp 5 lat temu
rodzic
commit
a806b29cb9

+ 1 - 0
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);
 }
 

+ 6 - 3
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: