Matt Turner <matts...@gmail.com> writes:

> On Fri, Feb 6, 2015 at 6:42 AM, Francisco Jerez <curroje...@riseup.net> wrote:
>> ---
>>  src/mesa/drivers/dri/i965/brw_vec4.cpp | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp 
>> b/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> index c3f68e6..aaa4873 100644
>> --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
>> @@ -437,7 +437,8 @@ vec4_visitor::opt_reduce_swizzle()
>>     bool progress = false;
>>
>>     foreach_block_and_inst_safe(block, vec4_instruction, inst, cfg) {
>> -      if (inst->dst.file == BAD_FILE || inst->dst.file == HW_REG)
>> +      if (inst->dst.file == BAD_FILE || inst->dst.file == HW_REG ||
>> +          inst->is_send_from_grf())
>>           continue;
>>
>>        int swizzle[4];
>> --
>> 2.1.3
>
> Like the last patch, I totally believe this is a problem, I just want
> a little more explanation for how it was uncovered.

The problem is that it's not safe for opt_reduce_swizzle() to assume
that there is a one-to-one correspondence between vec4 channels of its
sources and its destination for send instructions.  For example, the
message may include a header which has an effect on all channels.  For
example:

| mov vgrf31.0:UD, 0D
| mov vgrf31.0.w:UD, 17D
| typed_surface_read vgrf33.0.x:UD, vgrf31.xyzw:UD, vgrf32.xxxx:UD, 1U

will get incorrectly reduced to:

| mov vgrf31.0:UD, 0D
| mov vgrf31.0.w:UD, 17D
| typed_surface_read vgrf33.0.x:UD, vgrf31.xxxx:UD, vgrf32.xxxx:UD, 1U

now subsequent optimization passes will assume that only the x component
of vgrf31 is used and will simplify the above code to:

| mov vgrf31.0.x:UD, 0D
| typed_surface_read vgrf33.0.x:UD, vgrf31.xxxx:UD, vgrf32.xxxx:UD, 1U

Attachment: pgpbayODW9xsk.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to