[Mesa-dev] [PATCH] nir/spirv: short-circuit when conditional branch contains end block

Jason Ekstrand jason at jlekstrand.net
Thu Mar 7 13:15:06 UTC 2019


Woah, is this legal SPIR-V? I think a second OpSelectionMerge is required.

--Jason


On March 6, 2019 05:25:26 "Juan A. Suarez Romero" <jasuarez at igalia.com> wrote:

> This fixes the case when the SPIR-V code has two nested conditional
> branches, but only one selection merge:
>
>
> [...]
> %1 = OpLabel
>     OpSelectionMerge %2 None
>     OpBranchConditional %3 %4 %2
> %4 = OpLabel
>     OpBranchConditional %3 %5 %2
> %5 = OpLabel
>     OpBranch %2
> %2 = OpLabel
> [...]
>
>
> In the second OpBranchConditional, as the else-part is the end
> block (started in the first OpBranchConditional) we can just follow the
> then-part.
>
>
> This fixes dEQP-VK.vkrunner.controlflow.2-obc-triangle-triangle
>
>
> CC: Jason Ekstrand <jason at jlekstrand.net>
> ---
> src/compiler/spirv/vtn_cfg.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
>
> diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
> index 7868eeb60bc..f749118efbe 100644
> --- a/src/compiler/spirv/vtn_cfg.c
> +++ b/src/compiler/spirv/vtn_cfg.c
> @@ -605,7 +605,16 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct 
> list_head *cf_list,
>             }
>          } 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. */
> +            /* Neither side of the if is something we can short-circuit,
> +             * unless one of the blocks is the end block. */
> +            if (then_block == end) {
> +               block = else_block;
> +               continue;
> +            } else if (else_block == end) {
> +               block = then_block;
> +               continue;
> +            }
> +
>             vtn_assert((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge);
>             struct vtn_block *merge_block =
>                vtn_value(b, block->merge[1], vtn_value_type_block)->block;
> --
> 2.20.1





More information about the mesa-dev mailing list