vc4: Prioritize allocating accumulators to short-lived values.
authorEric Anholt <eric@anholt.net>
Tue, 9 Dec 2014 01:43:29 +0000 (17:43 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 9 Dec 2014 08:55:14 +0000 (00:55 -0800)
commitab1b1fa6fbd72b05c48f83c9df5036c2bfe893a3
tree05d14561a1c6accf8c2450811434a6e545c6c289
parent0d4272cd8e7c45157140dc8e283707714a8238d5
vc4: Prioritize allocating accumulators to short-lived values.

The register allocator walks from the end of the nodes array looking for
trivially-allocatable things to put on the stack, meaning (assuming
everything is trivially colorable and gets put on the stack in a single
pass) the low node numbers get allocated first.  The things allocated
first happen to get the lower-numbered registers, which is to say the fast
accumulators that can be paired more easily.

When we previously made the nodes match the temporary register numbers,
we'd end up putting the shader inputs (VS or FS) in the accumulators,
which are often long-lived values.  By prioritizing the shortest-lived
values for allocation, we can get a lot more instructions that involve
accumulators, and thus fewer conflicts for raddr and WS.

total instructions in shared programs: 52870 -> 46428 (-12.18%)
instructions in affected programs:     52260 -> 45818 (-12.33%)
src/gallium/drivers/vc4/vc4_register_allocate.c