[Mesa-dev] [PATCH] spirv: consider bitsize when handling OpSwitch cases

Jason Ekstrand jason at jlekstrand.net
Tue Dec 19 20:33:38 UTC 2017


Oops, thanks.  Rb


On December 19, 2017 12:05:43 "Juan A. Suarez Romero" <jasuarez at igalia.com> 
wrote:

> When walking over all the cases in a OpSwitch, take in account the bitsize
> of the literals to avoid getting wrong cases.
> ---
>  src/compiler/spirv/vtn_cfg.c | 14 +++++++++++---
>  1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c
> index 8582c4f0e94..9c4cbe2e6a4 100644
> --- a/src/compiler/spirv/vtn_cfg.c
> +++ b/src/compiler/spirv/vtn_cfg.c
> @@ -513,13 +513,14 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct 
> list_head *cf_list,
>                       "Selector of OpSelect must have a type of OpTypeInt");
>
>           bool is_default = true;
> +         const uint bitsize = nir_alu_type_get_type_size(cond_type);
>           for (const uint32_t *w = block->branch + 2; w < branch_end;) {
>              uint64_t literal = 0;
>              if (!is_default) {
> -               if (nir_alu_type_get_type_size(cond_type) <= 32) {
> +               if (bitsize <= 32) {
>                    literal = *(w++);
>                 } else {
> -                  assert(nir_alu_type_get_type_size(cond_type) == 64);
> +                  assert(bitsize == 64);
>                    literal = vtn_u64_literal(w);
>                    w += 2;
>                 }
> @@ -544,7 +545,7 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct 
> list_head *cf_list,
>           /* Finally, we walk over all of the cases one more time and put
>            * them in fall-through order.
>            */
> -         for (const uint32_t *w = block->branch + 2; w < branch_end; w += 2) {
> +         for (const uint32_t *w = block->branch + 2; w < branch_end;) {
>              struct vtn_block *case_block =
>                 vtn_value(b, *w, vtn_value_type_block)->block;
>
> @@ -554,6 +555,13 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct 
> list_head *cf_list,
>              vtn_assert(case_block->switch_case);
>
>              vtn_order_case(swtch, case_block->switch_case);
> +
> +            if (bitsize <= 32) {
> +               w += 2;
> +            } else {
> +               assert(bitsize == 64);
> +               w += 3;
> +            }
>           }
>
>           enum vtn_branch_type branch_type =
> --
> 2.14.3
>




More information about the mesa-dev mailing list