[Mesa-dev] [PATCH v3 3/3] glsl: propagate full variables eagerly
Thomas Helland
thomashelland90 at gmail.com
Thu Jul 26 19:59:44 UTC 2018
Since we're always going top-down through the
program there should be no need to "walk backwards",
so this approach should be enough to get the whole chain
of assignments in one pass. Neat.
Reviewed-by: Thomas Helland<thomashelland90 at gmail.com>
2018-07-25 3:03 GMT+02:00 Caio Marcelo de Oliveira Filho
<caio.oliveira at intel.com>:
> When creating a new acp_entry after an assignment "c = b", check if b
> itself has an acp_entry with a full variable associated and use
> that. This reduces the number of passes the algorithm needs to
> propagate a value in a chain of assignments.
>
> I've tried to make a similar change to the write_partial, but it
> caused noise in the final output (hurting instruction count). The
> reason is for partials, a propagation might imply a swizzle
> operation.
>
> We could later investigate if it is worth to restrict the cases we are
> eager to avoid getting things worse because of swizzling.
> ---
> .../glsl/opt_copy_propagation_elements.cpp | 23 ++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/opt_copy_propagation_elements.cpp b/src/compiler/glsl/opt_copy_propagation_elements.cpp
> index cae6d3c0707..c44f7c56f11 100644
> --- a/src/compiler/glsl/opt_copy_propagation_elements.cpp
> +++ b/src/compiler/glsl/opt_copy_propagation_elements.cpp
> @@ -169,8 +169,29 @@ public:
> }
> }
>
> + /* If the rhs has an acp_entry pointing to another full variable, use
> + * that. This allows propagation to happen all in one pass, instead of
> + * having the value walking slowly. E.g.
> + *
> + * b = a
> + * c = b
> + * d = c
> + * use(d)
> + *
> + * will need one pass to propagate to
> + *
> + * b = a
> + * c = a // Because of b acp_entry.
> + * d = a // Because of c acp_entry that uses 'a' directly.
> + * use(a) // Because of d acp_entry that uses 'a' directly.
> + */
> + acp_entry *rhs_entry = read(rhs);
> + if (rhs_entry && rhs_entry->rhs_full != NULL) {
> + rhs = rhs_entry->rhs_full;
> + }
> + rhs_entry = pull_acp(rhs);
> +
> lhs_entry->rhs_full = rhs;
> - acp_entry *rhs_entry = pull_acp(rhs);
> _mesa_set_add(rhs_entry->dsts, lhs);
>
> if (lhs->type->is_vector()) {
> --
> 2.18.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list