[Mesa-dev] [PATCH] nir/deref: Drop zero ptr_as_array derefs
Jason Ekstrand
jason at jlekstrand.net
Sun Feb 3 15:53:08 UTC 2019
They are effectively (&x)[0] or *&x which does nothing.
---
src/compiler/nir/nir_deref.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c
index 2f5fda643ca..0af26b80e77 100644
--- a/src/compiler/nir/nir_deref.c
+++ b/src/compiler/nir/nir_deref.c
@@ -670,6 +670,27 @@ opt_deref_ptr_as_array(nir_builder *b, nir_deref_instr *deref)
assert(deref->deref_type == nir_deref_type_ptr_as_array);
nir_deref_instr *parent = nir_deref_instr_parent(deref);
+
+ if (nir_src_is_const(deref->arr.index) &&
+ nir_src_as_int(deref->arr.index) == 0) {
+ /* If it's a ptr_as_array deref with an index of 0, it does nothing
+ * and we can just replace its uses with its parent.
+ *
+ * The source of a ptr_as_array deref always has a deref_type of
+ * nir_deref_type_array or nir_deref_type_cast. If it's a cast, it
+ * may be trivial and we may be able to get rid of that too. Any
+ * trivial cast of trivial cast cases should be handled already by
+ * opt_deref_cast() above.
+ */
+ if (parent->deref_type == nir_deref_type_cast &&
+ is_trivial_deref_cast(parent))
+ parent = nir_deref_instr_parent(parent);
+ nir_ssa_def_rewrite_uses(&deref->dest.ssa,
+ nir_src_for_ssa(&parent->instr));
+ nir_instr_remove(&deref->instr);
+ return true;
+ }
+
if (parent->deref_type != nir_deref_type_array &&
parent->deref_type != nir_deref_type_ptr_as_array)
return false;
--
2.20.1
More information about the mesa-dev
mailing list