i965: Make DCE set null destinations on messages with side effects.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 15 Jan 2017 07:32:12 +0000 (23:32 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 18 Jan 2017 05:45:04 +0000 (21:45 -0800)
commit9919542f1cfff70524bc6117d19bf88e59159caa
tree9f1cca98e469b7afb4f2f311555da0461d450d6c
parent90bf39cd2b39874557a7c492d92b85945d45f3c6
i965: Make DCE set null destinations on messages with side effects.

(Co-authored by Matt Turner.)

Image atomics, for example, return a value - but the shader may not
want to use it.  We assigned a useless VGRF destination.  This seemed
harmless, but it can actually be quite harmful.  The register allocator
has to assign that VGRF to a real register.  It may assign the same
actual GRF to the destination of an instruction that follows soon after.

This results in a write-after-write (WAW) dependency, and stall.

A number of "Deus Ex: Mankind Divided" shaders use image atomics, but
don't use the return value.  Several of these were hitting WAW stalls
for nearly 14,000 (poorly estimated) cycles a pop.  Making dead code
elimination null out the destination avoids this issue.

This patch cuts one shader's estimated cycles by -98.39%!  Removing the
message response should also help with data cluster bandwidth.

On Skylake:

(instruction counts remain identical)

total cycles in shared programs: 255413890 -> 248081010 (-2.87%)
cycles in affected programs: 12019948 -> 4687068 (-61.01%)
helped: 24
HURT: 10

v2: Make can_omit_write independent of can_eliminate (Curro).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_fs_dead_code_eliminate.cpp