Sorry, sent twice the same patch. J.A.
On Tue, 2017-12-19 at 19:05 +0100, Juan A. Suarez Romero 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 = _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev