[Mesa-dev] [PATCH] nir/deref: Rematerialize parents in rematerialize_derefs_in_use_blocks

apinheiro apinheiro at igalia.com
Mon Feb 11 10:32:11 UTC 2019


Reviewed-by: Alejandro PiƱeiro <apinheiro at igalia.com>

On 11/2/19 5:28, Jason Ekstrand wrote:
> When nir_rematerialize_derefs_in_use_blocks_impl was first written, I
> attempted to optimize things a bit by not bothering to re-materialize
> the sources of deref instructions figuring that the final caller would
> take care of that.  However, in the case of more complex deref chains
> where the first link or two lives in block A and then another link and
> the load/store_deref intrinsic live in block B it doesn't work.  The
> code in rematerialize_deref_in_block looks at the tail of the chain,
> sees that it's already in block B and skips it, not realizing that part
> of the chain also lives in block A.
>
> The easy solution here is to just rematerialize deref sources of deref
> instructions as well.  This may potentially lead to a few more deref
> instructions being created by the conditions required for that to
> actually happen are fairly unlikely and, thanks to the caching, it's all
> linear time regardless.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109603
> ---
>   src/compiler/nir/nir_deref.c | 5 ++---
>   1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c
> index 13aa10c7532..7b56611915d 100644
> --- a/src/compiler/nir/nir_deref.c
> +++ b/src/compiler/nir/nir_deref.c
> @@ -574,10 +574,9 @@ nir_rematerialize_derefs_in_use_blocks_impl(nir_function_impl *impl)
>            _mesa_hash_table_clear(state.cache, NULL);
>   
>         nir_foreach_instr_safe(instr, block) {
> -         if (instr->type == nir_instr_type_deref) {
> -            nir_deref_instr_remove_if_unused(nir_instr_as_deref(instr));
> +         if (instr->type == nir_instr_type_deref &&
> +             nir_deref_instr_remove_if_unused(nir_instr_as_deref(instr)))
>               continue;
> -         }
>   
>            state.builder.cursor = nir_before_instr(instr);
>            nir_foreach_src(instr, rematerialize_deref_src, &state);


More information about the mesa-dev mailing list