nir: properly clear the entry sources in copy_prop_vars
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Sat, 15 Dec 2018 06:19:24 +0000 (22:19 -0800)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 19 Dec 2018 16:35:48 +0000 (08:35 -0800)
When updating a copy entry source value from a "non-SSA" (the data
come from a copy instruction) to a "SSA" (the data or parts of it come
from SSA values), it was possible to hold invalid data in ssa[0]
depending on the writemask.  Because the union, ssa[0] could contain a
pointer to a nir_deref_instr left-over from previous non-SSA usage.

Change code to clean up the array before use to avoid invalid data
around.

Fixes: 62332d139c8 "nir: Add a local variable-based copy propagation pass"
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_opt_copy_prop_vars.c

index a540e01529c297db3e49e855fa014d929b9ada0a..ce106be8de348f77fca1127be9ace69f7006b89b 100644 (file)
@@ -348,6 +348,9 @@ store_to_entry(struct copy_prop_var_state *state, struct copy_entry *entry,
                const struct value *value, unsigned write_mask)
 {
    if (value->is_ssa) {
+      /* Clear src if it was being used as non-SSA. */
+      if (!entry->src.is_ssa)
+         memset(entry->src.ssa, 0, sizeof(entry->src.ssa));
       entry->src.is_ssa = true;
       /* Only overwrite the written components */
       for (unsigned i = 0; i < 4; i++) {