nir: Add some asserts that we don't put derefs in phis
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 11 Sep 2018 18:06:01 +0000 (13:06 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 19 Sep 2018 07:00:49 +0000 (02:00 -0500)
The lcssa and phis_to_regs passes are used by various NIR optimizations
that modify the CFG.  Putting a couple of asserts will help ensure that
we don't accidentally put derefs in phis as part of an optimization
pass.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/compiler/nir/nir_from_ssa.c
src/compiler/nir/nir_to_lcssa.c
src/compiler/nir/nir_validate.c

index 1aa35509b11c9f7067b3c7f98d6eccb1d8809495..19d4bc3382036d04fdc38992b72504fa07b77f40 100644 (file)
@@ -901,6 +901,8 @@ nir_lower_phis_to_regs_block(nir_block *block)
 
       nir_foreach_phi_src(src, phi) {
          assert(src->src.is_ssa);
+         /* We don't want derefs ending up in phi sources */
+         assert(!nir_src_as_deref(src->src));
          place_phi_read(shader, reg, src->src.ssa, src->pred);
       }
 
index 9b3539193eae0cb25b33c8594537611754487efd..0f62fc39400dac596a1f3209bd38119bede7f909 100644 (file)
@@ -111,6 +111,9 @@ convert_loop_exit_for_ssa(nir_ssa_def *def, void *void_state)
    if (all_uses_inside_loop)
       return true;
 
+   /* We don't want derefs ending up in phi sources */
+   assert(def->parent_instr->type != nir_instr_type_deref);
+
    /* Initialize a phi-instruction */
    nir_phi_instr *phi = nir_phi_instr_create(state->shader);
    nir_ssa_dest_init(&phi->instr, &phi->dest,
index 8e6f5bfb68644f971537bb96ac7306954a7c7b72..1852224b520bb20267f1eacea454d17c65c8f503 100644 (file)
@@ -669,6 +669,7 @@ validate_phi_src(nir_phi_instr *instr, nir_block *pred, validate_state *state)
    nir_foreach_phi_src(src, instr) {
       if (src->pred == pred) {
          validate_assert(state, src->src.is_ssa);
+         validate_assert(state, src->src.ssa->parent_instr->type != nir_instr_type_deref);
          validate_src(&src->src, state, instr->dest.ssa.bit_size,
                       instr->dest.ssa.num_components);
          state->instr = NULL;