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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev