From 7cedc4128a1f9d8ecae00ff41ccf1b63e4f3ebd0 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 1 Jun 2020 18:01:05 -0500 Subject: [PATCH] spirv: Run repair_ssa if there are discard instructions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit SPIR-V's OpKill is a control-flow instruction but NIR's discard is not. Therefore, it can be valid SPIR-V to have if (...) { foo = /* something */ } else { discard; } use(foo); without any phi between the definition of foo and its use. This is not true in NIR, however, because NIR's discard isn't considered control-flow. Arguably, this is a NIR bug but making discard control- flow is a very deep change that can have serious ans subtle side-effects. The easier thing to do is just fix up the SSA in case we have an OpKill which might have gotten us into the above case. Fixes dEQP-VK.graphicsfuzz.vectors-and-discard-in-function with the new NIR dominance validation pass enabled. Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Daniel Schürmann Part-of: --- src/compiler/spirv/vtn_cfg.c | 3 ++- src/compiler/spirv/vtn_private.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c index a157356..fa7ab5e 100644 --- a/src/compiler/spirv/vtn_cfg.c +++ b/src/compiler/spirv/vtn_cfg.c @@ -686,6 +686,7 @@ vtn_process_block(struct vtn_builder *b, return NULL; case SpvOpKill: + b->has_kill = true; block->branch_type = vtn_branch_type_discard; return NULL; @@ -1367,7 +1368,7 @@ vtn_function_emit(struct vtn_builder *b, struct vtn_function *func, * but instructions in the continue may use SSA defs in the loop body. * Therefore, we need to repair SSA to insert the needed phi nodes. */ - if (b->has_loop_continue) + if (b->has_loop_continue || b->has_kill) nir_repair_ssa_impl(func->impl); func->emitted = true; diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index b47fed6..b0d8d11 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -683,6 +683,7 @@ struct vtn_builder { unsigned func_param_idx; bool has_loop_continue; + bool has_kill; /* false by default, set to true by the ContractionOff execution mode */ bool exact; -- 2.7.4