spirv: Restructure the case loop in OpSwitch handling
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 6 Dec 2017 18:09:28 +0000 (10:09 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 12 Dec 2017 06:28:34 +0000 (22:28 -0800)
Instead of calling vtn_add_case for the default case and then looping,
add an is_default variable and do everything inside the loop.  This will
make the next commit easier.

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/compiler/spirv/vtn_cfg.c

index 25140ffc7ddcb9e42fa27b980be0f91bbe078a77..28b811fc9a9900daf3127ba19f138f7441ea6d40 100644 (file)
@@ -425,9 +425,17 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
          const uint32_t *branch_end =
             block->branch + (block->branch[0] >> SpvWordCountShift);
 
-         vtn_add_case(b, swtch, break_block, block->branch[2], 0, true);
-         for (const uint32_t *w = block->branch + 3; w < branch_end; w += 2)
-            vtn_add_case(b, swtch, break_block, w[1], w[0], false);
+         bool is_default = true;
+         for (const uint32_t *w = block->branch + 2; w < branch_end;) {
+            uint32_t literal = 0;
+            if (!is_default)
+               literal = *(w++);
+
+            uint32_t block_id = *(w++);
+
+            vtn_add_case(b, swtch, break_block, block_id, literal, is_default);
+            is_default = false;
+         }
 
          /* Now, we go through and walk the blocks.  While we walk through
           * the blocks, we also gather the much-needed fall-through