spirv: fix OpBranchConditional when both branches are the same

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6246

Signed-off-by: Bozhenko Alexey <oleksii.bozhenko@globallogic.com>

Fixes: 64cb143b92 ("spirv: Fix handling of OpBranchConditional with same THEN and ELSE")
Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15929>
This commit is contained in:
Alexey Bozhenko
2022-04-13 15:16:16 +03:00
committed by Marge Bot
parent 4b7ba3869b
commit 25acf1d869

View File

@@ -1128,17 +1128,20 @@ vtn_emit_cf_list_structured(struct vtn_builder *b, struct list_head *cf_list,
const uint32_t *branch = vtn_if->header_block->branch;
vtn_assert((branch[0] & SpvOpCodeMask) == SpvOpBranchConditional);
bool sw_break = false;
/* If both branches are the same, just emit the first block, which is
* the only one we filled when building the CFG.
*/
if (branch[2] == branch[3]) {
vtn_emit_cf_list_structured(b, &vtn_if->then_body,
switch_fall_var, has_switch_break, handler);
if (vtn_if->then_type == vtn_branch_type_none) {
vtn_emit_cf_list_structured(b, &vtn_if->then_body,
switch_fall_var, &sw_break, handler);
} else {
vtn_emit_branch(b, vtn_if->then_type, switch_fall_var, &sw_break);
}
break;
}
bool sw_break = false;
nir_if *nif =
nir_push_if(&b->nb, vtn_get_nir_ssa(b, branch[1]));