lima/gpir: Rework the scheduler
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 11 Jan 2018 23:35:58 +0000 (18:35 -0500)
committerConnor Abbott <cwabbott0@gmail.com>
Thu, 18 Jul 2019 12:33:23 +0000 (14:33 +0200)
commit54434fe67068d9abdf73bfc3482337cc4315d2d3
tree70ae5fa227540a1f2aa450190cd1a41378c7d843
parent12645e8714d92f40b0da9d2e70022f7444860303
lima/gpir: Rework the scheduler

Now, we do scheduling at the same time as value register allocation. The
ready list now acts similarly to the array of registers in
value_regalloc, keeping us from running out of slots. Before this, the
value register allocator wasn't aware of the scheduling constraints of
the actual machine, which meant that it sometimes chose the wrong false
dependencies to insert. Now, we assign value registers at the same time
as we actually schedule instructions, making its choices reflect reality
much better. It was also conservative in some cases where the new scheme
doesn't have to be. For example, in something like:

1 = ld_att
2 = ld_uni
3 = add 1, 2

It's possible that one of 1 and 2 can't be scheduled in the same
instruction as 3, meaning that a move needs to be inserted, so the value
register allocator needs to assume that this sequence requires two
registers. But when actually scheduling, we could discover that 1, 2,
and 3 can all be scheduled together, so that they only require one
register. The new scheduler speculatively inserts the instruction under
consideration, as well as all of its child load instructions, and then
counts the number of live value registers after all is said and done.
This lets us be more aggressive with scheduling when we're close to the
limit.

With the new scheduler, the kmscube vertex shader is now scheduled in 40
instructions, versus 66 before.

Acked-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/ir/gp/codegen.c
src/gallium/drivers/lima/ir/gp/gpir.h
src/gallium/drivers/lima/ir/gp/instr.c
src/gallium/drivers/lima/ir/gp/nir.c
src/gallium/drivers/lima/ir/gp/node.c
src/gallium/drivers/lima/ir/gp/physical_regalloc.c [deleted file]
src/gallium/drivers/lima/ir/gp/regalloc.c [new file with mode: 0644]
src/gallium/drivers/lima/ir/gp/scheduler.c
src/gallium/drivers/lima/ir/gp/value_regalloc.c [deleted file]
src/gallium/drivers/lima/meson.build