nir/spirv: Allow OpBranchConditional without a merge
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 12 Jan 2016 01:03:50 +0000 (17:03 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 12 Jan 2016 01:03:52 +0000 (17:03 -0800)
This can happen if you have a predicated break/continue.

src/glsl/nir/spirv/vtn_cfg.c

index a927fb728c1521b17b571952923902c172f41cb9..b3061ce47bb7b4b7c1a06debee18d2881db0022c 100644 (file)
@@ -325,12 +325,10 @@ vtn_cfg_walk_blocks(struct vtn_builder *b, struct list_head *cf_list,
 
          list_addtail(&if_stmt->node.link, cf_list);
 
-         /* OpBranchConditional must be at the end of a block with either
-          * an OpSelectionMerge or an OpLoopMerge.
-          */
-         assert(block->merge);
-         if ((*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge)
+         if (block->merge &&
+             (*block->merge & SpvOpCodeMask) == SpvOpSelectionMerge) {
             if_stmt->control = block->merge[2];
+         }
 
          if_stmt->then_type = vtn_get_branch_type(then_block,
                                                   switch_case, switch_break,