nir/deref: remove casts of casts which are likely redundant (v3)
Not sure how ptr_stride should be taken into account if at all here v2: reorder check to avoid src walking (Jason) v3: remove is_cast_cast checks, keep going afterwards (Jason) Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
3b3653c4cf
commit
b95b33a5c7
|
@ -675,18 +675,42 @@ is_deref_ptr_as_array(nir_instr *instr)
|
|||
nir_instr_as_deref(instr)->deref_type == nir_deref_type_ptr_as_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove casts that just wrap other casts.
|
||||
*/
|
||||
static bool
|
||||
opt_remove_cast_cast(nir_deref_instr *cast)
|
||||
{
|
||||
nir_deref_instr *first_cast = cast;
|
||||
|
||||
while (true) {
|
||||
nir_deref_instr *parent = nir_deref_instr_parent(first_cast);
|
||||
if (parent == NULL || parent->deref_type != nir_deref_type_cast)
|
||||
break;
|
||||
first_cast = parent;
|
||||
}
|
||||
if (cast == first_cast)
|
||||
return false;
|
||||
|
||||
nir_instr_rewrite_src(&cast->instr, &cast->parent,
|
||||
nir_src_for_ssa(first_cast->parent.ssa));
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
opt_deref_cast(nir_deref_instr *cast)
|
||||
{
|
||||
bool progress;
|
||||
|
||||
progress = opt_remove_cast_cast(cast);
|
||||
if (!is_trivial_deref_cast(cast))
|
||||
return false;
|
||||
return progress;
|
||||
|
||||
bool trivial_array_cast = is_trivial_array_deref_cast(cast);
|
||||
|
||||
assert(cast->dest.is_ssa);
|
||||
assert(cast->parent.is_ssa);
|
||||
|
||||
bool progress = false;
|
||||
nir_foreach_use_safe(use_src, &cast->dest.ssa) {
|
||||
/* If this isn't a trivial array cast, we can't propagate into
|
||||
* ptr_as_array derefs.
|
||||
|
|
Loading…
Reference in New Issue