[Mesa-dev] [PATCH 02/23] i965/fs: fix copy propagation from sources with stride 0

Samuel Iglesias Gonsálvez siglesias at igalia.com
Wed May 11 07:01:14 UTC 2016


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256



On 10/05/16 22:57, Francisco Jerez wrote:
> Samuel Iglesias Gonsálvez <siglesias at igalia.com> writes:
> 
>> From: Iago Toral Quiroga <itoral at igalia.com>
>> 
>> We should not offset into them based on the relative offset of 
>> our source and the destination of the instruction we are copy 
>> propagating from, so we don't turn this:
>> 
>> mov(16) vgrf6:F, vgrf7+0.0<0>:F (...) load_payload(8) vgrf28:F,
>> vgrf6+1.0:F 2ndhalf mov(8) vgrf29:DF, vgrf28:F 2ndhalf
>> 
>> into:
>> 
>> mov(16) vgrf6:F, vgrf7+0.0<0>:F (...) load_payload(8) vgrf28:F,
>> vgrf7+1.0<0>:F 2ndhalf mov(8) vgrf29:DF, vgrf7+1.0<0>:F 2ndhalf
>> 
>> and instead we do this:
>> 
>> mov(16) vgrf6:F, vgrf7+0.0<0>:F (...) load_payload(8) vgrf28:F,
>> vgrf7+0.0<0>:F 2ndhalf mov(8) vgrf29:DF, vgrf7+0.0<0>:F 2ndhalf 
>> --- src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp | 16
>> +++++++++++++--- 1 file changed, 13 insertions(+), 3
>> deletions(-)
>> 
>> diff --git
>> a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
>> b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp index
>> becc8bc..9147e60 100644 ---
>> a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp +++
>> b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp @@
>> -460,10 +460,20 @@ fs_visitor::try_copy_propagate(fs_inst *inst,
>> int arg, acp_entry *entry) * parts of vgrfs so we have to do some
>> reg_offset magic. */
>> 
>> -         /* Compute the offset of inst->src[arg] relative to
>> inst->dst */ +         /* Compute the offset of inst->src[arg]
>> relative to inst->dst +          * +          * If the source we
>> are copy propagating from has a stride of 0, then +          * we
>> must not offset into it based on the offset of our source +
>> * relative to entry->dst +          */ 
>> assert(entry->dst.subreg_offset == 0); -         int rel_offset =
>> inst->src[arg].reg_offset - entry->dst.reg_offset; -         int
>> rel_suboffset = inst->src[arg].subreg_offset; +         int
>> rel_offset, rel_suboffset; +         if (entry->src.stride != 0)
>> { +            rel_offset = inst->src[arg].reg_offset -
>> entry->dst.reg_offset; +            rel_suboffset =
>> inst->src[arg].subreg_offset; +         } else { +
>> rel_offset = rel_suboffset = 0; +         }
> 
> Sigh, this fixes the problem for stride == 0 but leaves the logic
> broken in the general case.  Turns out I came across the same
> problem with SIMD32 and came up with the fix below that should work
> regardless of the stride value...
> 

Thanks for the fix! We will use it instead and test it.

Sam

>> 
>> /* Compute the final register offset (in bytes) */ int offset =
>> entry->src.reg_offset * 32 + entry->src.subreg_offset; -- 2.5.0
>> 
>> _______________________________________________ mesa-dev mailing
>> list mesa-dev at lists.freedesktop.org 
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJXMti6AAoJEH/0ujLxfcNDsv4P/3EnZMjaOWthqw6A1i6IlT2C
Z9nZlteua2V7guqC/yFIZQeX6UffSP9BzQ0ZUiCG/+9jg6zBfSzDNCEgWkLu/CxA
Ihc8mcFh82Hxb8c6BVgduE2Ir08o34cYHMeojlVOwQVPavj3X/pbaeiYTyizriI4
NK+VjyfYBeOcfCN0uxSpOkhU+QMSN4XTJS7hly3+KmIWcY8ocR6Ymy+Dr1KFpn2u
U0EdeQZ8HLKPhufMT3sTRx6sazBl39OeBfSLF6s2Gfc8mXX3obS7F4A+HIfXUqIg
KJAt6fYU7aMSaxzx/kcjQ0WuZV+LJvTn/tgFPrZoBpXlwAdvVqPX2hiu+wUfOM6u
nibSu9p5DdP5wxWMWPJSn8BNAcOW/eBrzLBd8jCYEnhANdStwQTC2gukI/M5pN81
Kdid/T4BfWHeAPJsK6N9+oxix+ecrs6VXwXVuraPgBwBG5LYYm8diYJ5tImnL7kh
AcvlHywmJw8Y8ocnoQ+DXVb3amzygWctXrFmTQ1SW9ddLXK5YPrPrR9s5RtPpopl
I4bFCKLRGWQpSxcMdu0OAMn+VaaToOEZHMar1NA+qxCT7hziSjGz33ypJBN+jW3P
IUYGsNKcBX3Lq75u/C0y7IOc8q+YMm3kUIbPET05t4Zd7QeNP1WuOEepoB4yXe3Y
zkDenIskGfWfU/l587kJ
=GihL
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list