[Mesa-dev] [PATCH 1/4] nir/from_ssa: add a flag to not convert everything to SSA
Jason Ekstrand
jason at jlekstrand.net
Thu Jun 25 13:36:01 PDT 2015
On Thu, Jun 25, 2015 at 12:29 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:
> We already don't convert constants out of SSA, and in our backend we'd
> like to have only one way of saying something is still in SSA.
>
> The one tricky part about this is that we may now leave some undef
> instructions around if they aren't part of a phi-web, so we have to be
> more careful about deleting them.
>
> Signed-off-by: Connor Abbott <cwabbott0 at gmail.com>
> ---
> src/gallium/drivers/vc4/vc4_program.c | 2 +-
> src/glsl/nir/nir.h | 7 ++++++-
> src/glsl/nir/nir_from_ssa.c | 25 ++++++++++++++++++-------
> src/mesa/drivers/dri/i965/brw_nir.c | 2 +-
> 4 files changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
> index 2061631..1a550e1 100644
> --- a/src/gallium/drivers/vc4/vc4_program.c
> +++ b/src/gallium/drivers/vc4/vc4_program.c
> @@ -2102,7 +2102,7 @@ vc4_shader_ntq(struct vc4_context *vc4, enum qstage stage,
>
> nir_remove_dead_variables(c->s);
>
> - nir_convert_from_ssa(c->s);
> + nir_convert_from_ssa(c->s, true);
>
> if (vc4_debug & VC4_DEBUG_SHADERDB) {
> fprintf(stderr, "SHADER-DB: %s prog %d/%d: %d NIR instructions\n",
> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
> index 697d37e..2116f60 100644
> --- a/src/glsl/nir/nir.h
> +++ b/src/glsl/nir/nir.h
> @@ -1676,7 +1676,12 @@ bool nir_ssa_defs_interfere(nir_ssa_def *a, nir_ssa_def *b);
>
> void nir_convert_to_ssa_impl(nir_function_impl *impl);
> void nir_convert_to_ssa(nir_shader *shader);
> -void nir_convert_from_ssa(nir_shader *shader);
> +
> +/* If convert_everything is true, convert all values (even those not involved
> + * in a phi node) to registers. If false, only convert SSA values involved in
> + * phi nodes to registers.
> + */
> +void nir_convert_from_ssa(nir_shader *shader, bool convert_everything);
I don't think "convert everything" is really what we want to call it.
A better idea might be to flip the bool and call it phi_webs_only.
With that changed,
Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>
>
> bool nir_opt_algebraic(nir_shader *shader);
> bool nir_opt_algebraic_late(nir_shader *shader);
> diff --git a/src/glsl/nir/nir_from_ssa.c b/src/glsl/nir/nir_from_ssa.c
> index 67733e6..966c2fe 100644
> --- a/src/glsl/nir/nir_from_ssa.c
> +++ b/src/glsl/nir/nir_from_ssa.c
> @@ -37,6 +37,7 @@
> struct from_ssa_state {
> void *mem_ctx;
> void *dead_ctx;
> + bool convert_everything;
> struct hash_table *merge_node_table;
> nir_instr *instr;
> nir_function_impl *impl;
> @@ -482,6 +483,9 @@ rewrite_ssa_def(nir_ssa_def *def, void *void_state)
>
> reg = node->set->reg;
> } else {
> + if (!state->convert_everything)
> + return true;
> +
> /* We leave load_const SSA values alone. They act as immediates to
> * the backend. If it got coalesced into a phi, that's ok.
> */
> @@ -505,8 +509,15 @@ rewrite_ssa_def(nir_ssa_def *def, void *void_state)
> nir_ssa_def_rewrite_uses(def, nir_src_for_reg(reg), state->mem_ctx);
> assert(list_empty(&def->uses) && list_empty(&def->if_uses));
>
> - if (def->parent_instr->type == nir_instr_type_ssa_undef)
> + if (def->parent_instr->type == nir_instr_type_ssa_undef) {
> + /* If it's an ssa_undef instruction, remove it since we know we just got
> + * rid of all its uses.
> + */
> + nir_instr *parent_instr = def->parent_instr;
> + nir_instr_remove(parent_instr);
> + ralloc_steal(state->dead_ctx, parent_instr);
> return true;
> + }
>
> assert(def->parent_instr->type != nir_instr_type_load_const);
>
> @@ -523,7 +534,7 @@ rewrite_ssa_def(nir_ssa_def *def, void *void_state)
> }
>
> /* Resolves ssa definitions to registers. While we're at it, we also
> - * remove phi nodes and ssa_undef instructions
> + * remove phi nodes.
> */
> static bool
> resolve_registers_block(nir_block *block, void *void_state)
> @@ -534,8 +545,7 @@ resolve_registers_block(nir_block *block, void *void_state)
> state->instr = instr;
> nir_foreach_ssa_def(instr, rewrite_ssa_def, state);
>
> - if (instr->type == nir_instr_type_ssa_undef ||
> - instr->type == nir_instr_type_phi) {
> + if (instr->type == nir_instr_type_phi) {
> nir_instr_remove(instr);
> ralloc_steal(state->dead_ctx, instr);
> }
> @@ -765,13 +775,14 @@ resolve_parallel_copies_block(nir_block *block, void *void_state)
> }
>
> static void
> -nir_convert_from_ssa_impl(nir_function_impl *impl)
> +nir_convert_from_ssa_impl(nir_function_impl *impl, bool convert_everything)
> {
> struct from_ssa_state state;
>
> state.mem_ctx = ralloc_parent(impl);
> state.dead_ctx = ralloc_context(NULL);
> state.impl = impl;
> + state.convert_everything = convert_everything;
> state.merge_node_table = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
> _mesa_key_pointer_equal);
>
> @@ -801,10 +812,10 @@ nir_convert_from_ssa_impl(nir_function_impl *impl)
> }
>
> void
> -nir_convert_from_ssa(nir_shader *shader)
> +nir_convert_from_ssa(nir_shader *shader, bool convert_everything)
> {
> nir_foreach_overload(shader, overload) {
> if (overload->impl)
> - nir_convert_from_ssa_impl(overload->impl);
> + nir_convert_from_ssa_impl(overload->impl, convert_everything);
> }
> }
> diff --git a/src/mesa/drivers/dri/i965/brw_nir.c b/src/mesa/drivers/dri/i965/brw_nir.c
> index dffb8ab..3e154c1 100644
> --- a/src/mesa/drivers/dri/i965/brw_nir.c
> +++ b/src/mesa/drivers/dri/i965/brw_nir.c
> @@ -156,7 +156,7 @@ brw_create_nir(struct brw_context *brw,
> nir_print_shader(nir, stderr);
> }
>
> - nir_convert_from_ssa(nir);
> + nir_convert_from_ssa(nir, true);
> nir_validate_shader(nir);
>
> /* This is the last pass we run before we start emitting stuff. It
> --
> 2.4.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list