i965/fs: Fix rewrite of the second half of 16-wide coalesced registers.
authorFrancisco Jerez <currojerez@riseup.net>
Mon, 13 Jul 2015 11:20:32 +0000 (14:20 +0300)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 29 Jul 2015 11:12:02 +0000 (14:12 +0300)
commit170200e0fcb0b16d20bff86e1258e0a1b2034c10
tree22c4c0c6b53f36fab5d05d8d2b9fa9a246256722
parentd0a42b457fb905ce2cc12bb05110ef63656221c9
i965/fs: Fix rewrite of the second half of 16-wide coalesced registers.

The register coalesce pass wasn't rewriting the destination and
sources of instructions that accessed the second half of a coalesced
register previously copied with a 16-wide MOV instruction.  E.g.:

| ADD (16) vgrf0:f, vgrf0:f, 1.0:f
| MOV (16) vgrf1:f, vgrf0:f
| MOV (8)  vgrf2:f, vgrf0+1:f { sechalf }

would get incorrectly register-coalesced into:

| ADD (16) vgrf1:f, vgrf1:f, 1.0:f
| MOV (8)  vgrf2:f, vgrf0+1:f { sechalf }

The reason is that the mov[i] pointer was being left equal to NULL for
every other register.  The fact that we've made it to the rewrite loop
implies that the whole register will be coalesced, so it doesn't seem
right not to update something that uses it depending on whether mov[i]
is NULL or not.  Fixes an amount of texturing and image_load_store
piglit tests on my SIMD-lowering branch.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp