Module: Mesa
Branch: master
Commit: 9702fac68e8bd07be8871f7925d7f9fb98da3699
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9702fac68e8bd07be8871f7925d7f9fb98da3699

Author: Juan A. Suarez Romero <[email protected]>
Date:   Tue Dec 19 17:55:24 2017 +0000

spirv: consider bitsize when handling OpSwitch cases

When walking over all the cases in a OpSwitch, take in account the bitsize
of the literals to avoid getting wrong cases.

Reviewed-by: Jason Ekstrand <[email protected]>

---

 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 8582c4f0e9..9c4cbe2e6a 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-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to