mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
nir/from_ssa: Only re-locate values that are destinations
There is an optimization in the parallel copy algorithm where, after a copy has been performed, we can treat the destination as the new source for future copies of the same source. In particular, consider the following parallel copy: A -> B, C -> A, A -> C. In this case, after we have done the A -> B copy, we can make note that the value in A is now in B and emit the sequence: A -> B, C -> A, B -> C. This allows us to resolve the swap cycle between A anc C without allocating a temporary register because we know B is also a copy of A. When one of the registers involved is convergent and the other is divergent, this optimization is problematic because, while convergent to divergent copies are fine, we can't re-use the divergent copy in later copies if any of those copies are to a convergent variable. We could, but it would require a read_first_invocation which would get messy. In Inc7fc44f9eb("nir/from_ssa: Respect and populate divergence information"), we attempted to deal with this by limiting the rename optimization to the case where the divergence matched. The problem is that we did the re-name part whenever the divergence matched but only marked it as ready if the thing being copied was a destination. (We actually left two instances of loc[a] = b, one which always happened and one which only happened if we also wanted to flag the source as being ready to use as a destination.) While this technically doesn't cause any problems, it may result in more inter-mov dependencies which hurts instruction scheduling. For example, if we had the parallel copy A -> B, A -> C, A -> D, we now end up emitting the sequence A -> B, B -> C, C -> D which has many more data hazards between instructions caused by the constant shuffling. This commit restores the original logic in which we only perform the rename optimization if the rename would free up a register we will later use as a destination. This isn't entirely optimal as it still doesn't prove that there is a cycle involved first, but it should lead to a reduction in unnecessary dependencies. No shader-db changes on SKL or DG2 Fixes:c7fc44f9eb("nir/from_ssa: Respect and populate divergence information") Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21315> (cherry picked from commit5afba073c6)
This commit is contained in:
parent
db645ee390
commit
8eb3e6d1a3
2 changed files with 1 additions and 6 deletions
|
|
@ -13,7 +13,7 @@
|
|||
"description": "nir/from_ssa: Only re-locate values that are destinations",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "c7fc44f9ebbe93f7aefc010aea4e13e29d0d67fd"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -783,11 +783,6 @@ resolve_parallel_copy(nir_parallel_copy_instr *pcopy,
|
|||
*/
|
||||
if (nir_src_is_divergent(values[a]) ==
|
||||
nir_src_is_divergent(values[b])) {
|
||||
/* If any other copies want a they can find it at b but only if the
|
||||
* two have the same divergence.
|
||||
*/
|
||||
loc[a] = b;
|
||||
|
||||
/* If a needs to be filled... */
|
||||
if (pred[a] != -1) {
|
||||
/* If any other copies want a they can find it at b */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue