diff options
author | Caio Marcelo de Oliveira Filho <[email protected]> | 2018-08-10 16:04:04 -0700 |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <[email protected]> | 2018-08-22 14:41:26 -0700 |
commit | 8364ec3fcee692d70b7d653dd433a3194d88dd82 (patch) | |
tree | bfdf33fb145c2a06e7936890a31835a6b154e428 | |
parent | 5196041e937584d6bab940c26eb608dcfab7129b (diff) |
nir: Skip common instructions when comparing deref paths
Deref paths may share the same deref instructions in their chains,
e.g.
ssa_100 = deref_var A
ssa_101 = deref_struct "array_field" of ssa_100
ssa_102 = deref_array "[1]" of ssa_101
ssa_103 = deref_struct "field_a" of ssa_102
ssa_104 = deref_struct "field_a" of ssa_103
when comparing the two last deref instructions, their paths will share
a common sequence ssa_100, ssa_101, ssa_102. This patch skips to next
iteration if the deref instructions are the same. Path[0] (the var)
is still handled specially, so in the case above, only ssa_101 and
ssa_102 will be skipped.
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/compiler/nir/nir_deref.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c index d013b423a8b..c8851688f9d 100644 --- a/src/compiler/nir/nir_deref.c +++ b/src/compiler/nir/nir_deref.c @@ -294,6 +294,9 @@ nir_compare_deref_paths(nir_deref_path *a_path, nir_deref_instr *a_tail = *(a_p++); nir_deref_instr *b_tail = *(b_p++); + if (a_tail == b_tail) + continue; + switch (a_tail->deref_type) { case nir_deref_type_array: case nir_deref_type_array_wildcard: { |