3
0
Fork 0
forked from suyu/suyu

shader: Fix structured control flow on KIL instructions

This could potentially leave unvisited blocks, leading to illegal phi
nodes.
This commit is contained in:
ReinUsesLisp 2021-03-27 02:54:32 -03:00 committed by ameerj
parent cdf0cc3869
commit a806b29cb9
2 changed files with 7 additions and 3 deletions

View file

@ -83,6 +83,7 @@ void IREmitter::SelectionMerge(Block* merge_block) {
} }
void IREmitter::Return() { void IREmitter::Return() {
block->SetReturn();
Inst(Opcode::Return); Inst(Opcode::Return);
} }

View file

@ -152,7 +152,9 @@ std::string DumpTree(const Tree& tree, u32 indentation = 0) {
for (auto stmt = tree.begin(); stmt != tree.end(); ++stmt) { for (auto stmt = tree.begin(); stmt != tree.end(); ++stmt) {
switch (stmt->type) { switch (stmt->type) {
case StatementType::Code: 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; break;
case StatementType::Goto: case StatementType::Goto:
ret += fmt::format("{} if ({}) goto L{};\n", indent, DumpExpr(stmt->cond), ret += fmt::format("{} if ({}) goto L{};\n", indent, DumpExpr(stmt->cond),
@ -749,8 +751,9 @@ private:
current_block = block_pool.Create(inst_pool); current_block = block_pool.Create(inst_pool);
block_list.push_back(current_block); block_list.push_back(current_block);
} }
IR::IREmitter{*current_block}.DemoteToHelperInvocation(continue_block); IR::Block* demote_block{MergeBlock(parent, stmt)};
current_block = nullptr; IR::IREmitter{*current_block}.DemoteToHelperInvocation(demote_block);
current_block = demote_block;
break; break;
} }
default: default: