[Mesa-dev] [PATCH] nir/spirv: return after emitting a branch in block

Jason Ekstrand jason at jlekstrand.net
Wed Feb 27 17:05:19 UTC 2019


Those fuzzing guys are mean...

This stuff is subtle but I think this is correct.  Assuming you've run it
through our CI and everything is good,

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

On Wed, Feb 27, 2019 at 5:05 AM Juan A. Suarez Romero <jasuarez at igalia.com>
wrote:

> When emitting a branch in a block, it does not make sense to continue
> processing further instructions, as they will not be reachable.
>
> This fixes a nasty case with a loop with a branch that both then-part
> and else-part exits the loop:
>
> %1 = OpLabel
>      OpLoopMerge %2 %3 None
>      OpBranchConditional %false %2 %2
> %3 = OpLabel
>      OpBranch %1
> %2 = OpLabel
>     [...]
>
> We know that block %1 will branch always to block %2, which is the merge
> block for the loop. And thus a break is emitted. If we keep continuing
> processing further instructions, we will be processing the branch
> conditional and thus emitting the proper NIR conditional, which leads to
> instructions after the break.
>
> This fixes dEQP-VK.graphicsfuzz.continue-and-merge.
>
> CC: Jason Ekstrand <jason at jlekstrand.net>
> ---
>  src/compiler/spirv/vtn_cfg.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
> index c32d54e9006..7868eeb60bc 100644
> --- a/src/compiler/spirv/vtn_cfg.c
> +++ b/src/compiler/spirv/vtn_cfg.c
> @@ -916,6 +916,7 @@ vtn_emit_cf_list(struct vtn_builder *b, struct
> list_head *cf_list,
>           if (block->branch_type != vtn_branch_type_none) {
>              vtn_emit_branch(b, block->branch_type,
>                              switch_fall_var, has_switch_break);
> +            return;
>           }
>
>           break;
> --
> 2.20.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190227/bf12b8f3/attachment.html>


More information about the mesa-dev mailing list