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>tags/18.3-branchpoint
| @@ -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); | |||
| } | |||
| @@ -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, | |||
| @@ -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; | |||