nir/spirv: skip unreachable blocks in Phi second pass
authorJuan A. Suarez Romero <jasuarez@igalia.com>
Thu, 7 Nov 2019 08:33:09 +0000 (08:33 +0000)
committerJuan A. Suarez Romero <jasuarez@igalia.com>
Wed, 8 Jan 2020 10:32:24 +0000 (11:32 +0100)
Only the blocks that are reachable are inserted with an end_nop
instruction at the end.

When handling the Phi second pass, if the Phi has a parent block that
does not have an end_nop then it means this block is unreachable, and
thus we can ignore it, as the Phi will never come through it.

Fixes dEQP-VK.graphicsfuzz.uninit-element-cast-in-loop.

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/compiler/spirv/vtn_cfg.c

index 67c3245126dad94e6b2c9b9f5e6d4033b06f03ff..25e2f285e79942f1c9f9d37f3300748b4bf807d4 100644 (file)
@@ -811,6 +811,11 @@ vtn_handle_phi_second_pass(struct vtn_builder *b, SpvOp opcode,
       struct vtn_block *pred =
          vtn_value(b, w[i + 1], vtn_value_type_block)->block;
 
+      /* If block does not have end_nop, that is because it is an unreacheable
+       * block, and hence it is not worth to handle it */
+      if (!pred->end_nop)
+         continue;
+
       b->nb.cursor = nir_after_instr(&pred->end_nop->instr);
 
       struct vtn_ssa_value *src = vtn_ssa_value(b, w[i]);