spirv: Handle OOB vector extract operations
authorJason Ekstrand <jason@jlekstrand.net>
Thu, 9 Apr 2020 21:44:33 +0000 (16:44 -0500)
committerMarge Bot <eric+marge@anholt.net>
Fri, 17 Apr 2020 19:21:44 +0000 (19:21 +0000)
We use vtn_vector_extract to handle vector component level derefs.  This
makes us gracefully handle the case where your vector component is OOB
and give you an undef.  The SPIR-V working group is still working out
whether or not this is technically legal but it's very little code for
us to handle it so we may as well.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4495>

src/compiler/spirv/spirv_to_nir.c

index 3ebe85e46ab6958b85901746cab1782dd9ec3317..e0e8fdba27c1e94711f653566416abe2dfeeeafc 100644 (file)
@@ -3314,7 +3314,10 @@ vtn_ssa_transpose(struct vtn_builder *b, struct vtn_ssa_value *src)
 nir_ssa_def *
 vtn_vector_extract(struct vtn_builder *b, nir_ssa_def *src, unsigned index)
 {
-   return nir_channel(&b->nb, src, index);
+   if (index > src->num_components)
+      return nir_ssa_undef(&b->nb, src->num_components, src->bit_size);
+   else
+      return nir_channel(&b->nb, src, index);
 }
 
 nir_ssa_def *