mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 10:30:08 +01:00
spirv: fix visiting inner loops with same break/continue block
We should stop walking through the CFG when the inner loop's break block ends up as the same block as the outer loop's continue block because we are already going to visit it. This fixes the following assertion which ends up by crashing in RADV or ANV: SPIR-V parsing FAILED: In file ../src/compiler/spirv/vtn_cfg.c:381 block->node.link.next == NULL 0 bytes into the SPIR-V binary This also fixes a crash with a camera shader from SteamVR. v2: make use of vtn_get_branch_type() and add an assertion Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106090 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106504 CC: 18.0 18.1 <mesa-stable@lists.freedesktop.org> Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
d89f58a6b8
commit
6bde8c5608
1 changed files with 13 additions and 0 deletions
|
|
@ -374,6 +374,19 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
|
|||
vtn_cfg_walk_blocks(b, &loop->cont_body, new_loop_cont, NULL, NULL,
|
||||
new_loop_break, NULL, block);
|
||||
|
||||
enum vtn_branch_type branch_type =
|
||||
vtn_get_branch_type(b, new_loop_break, switch_case, switch_break,
|
||||
loop_break, loop_cont);
|
||||
|
||||
if (branch_type != vtn_branch_type_none) {
|
||||
/* Stop walking through the CFG when this inner loop's break block
|
||||
* ends up as the same block as the outer loop's continue block
|
||||
* because we are already going to visit it.
|
||||
*/
|
||||
vtn_assert(branch_type == vtn_branch_type_loop_continue);
|
||||
return;
|
||||
}
|
||||
|
||||
block = new_loop_break;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue