i965/fs: Before reg alloc, schedule instructions to reduce live ranges.
authorEric Anholt <eric@anholt.net>
Tue, 4 Dec 2012 03:59:55 +0000 (19:59 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 14 Dec 2012 23:17:59 +0000 (15:17 -0800)
commit456dbcc3377ee23dbeffa4da02a4d80a8519bb62
tree6d58f3cee863898587e89a02243d25af01e50244
parentba864bfcfaceac37a5f9292795dc5aba7dc2c0e2
i965/fs: Before reg alloc, schedule instructions to reduce live ranges.

This came from an idea by Ben Segovia.  16-wide pixel shaders are very
important for latency hiding on i965, so we want to try really hard to
get them.  If scheduling an instruction makes some set of instructions
available, those are probably the ones that make the instruction's
result dead.  By choosing those first, we'll have a tendency to reduce
the amount of live data as opposed to creating more.

Previously, we were sometimes getting this behavior out of the
scheduler, which was what produced the scheduler's original performance
wins on lightsmark.  Unfortunately, that was mostly an accident of the
lame instruction latency information that I had, which made it
impossible to fix the actual scheduling for performance.  Now that we've
fixed the scheduling for setup for register allocation, we can safely
update the latency parameters for the final schedule.

In shader-db, we lose 37 16-wide shaders, but gain 90 new ones.  4
shaders that were spilling change how many registers spill, for a
reduction of 70/3899 instructions.

v2: Simplify the new loop.

Acked-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp