nir/spirv: handle if's with same label in both branches
When a conditional branch has the same labels in the "if" part and in the "else" part, then we have the same cfg block, and it must be handled once. v2: handle it the same way as OpBranch (Jason). Fixes: dEQP-VK.spirv_assembly.instruction.compute.conditional_branch.same_labels* dEQP-VK.spirv_assembly.instruction.graphics.conditional_branch.same_labels* Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
committed by
Samuel Iglesias Gonsálvez
parent
5666d3e3e5
commit
806ae6a648
@@ -356,8 +356,16 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
|
||||
switch_case, switch_break,
|
||||
loop_break, loop_cont);
|
||||
|
||||
if (if_stmt->then_type == vtn_branch_type_none &&
|
||||
if_stmt->else_type == vtn_branch_type_none) {
|
||||
if (then_block == else_block) {
|
||||
block->branch_type = if_stmt->then_type;
|
||||
if (block->branch_type == vtn_branch_type_none) {
|
||||
block = then_block;
|
||||
continue;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else if (if_stmt->then_type == vtn_branch_type_none &&
|
||||
if_stmt->else_type == vtn_branch_type_none) {
|
||||
/* Neither side of the if is something we can short-circuit. */
|
||||
assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge);
|
||||
struct vtn_block *merge_block =
|
||||
|
||||
Reference in New Issue
Block a user