[Mesa-stable] [Mesa-dev] [PATCH] st/mesa: treat a write as a read for range purposes
Ilia Mirkin
imirkin at alum.mit.edu
Mon Feb 1 02:32:17 CET 2016
On Sun, Jan 31, 2016 at 7:29 PM, Dave Airlie <airlied at gmail.com> wrote:
> On 30 January 2016 at 07:00, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> We use this logic to detect live ranges and then do plain renaming
>> across the whole codebase. As such, to prevent WaW hazards, we have to
>> treat a write as if it were also a read.
>>
>> For example, the following sequence was observed before this patch:
>>
>> 13: UIF TEMP[6].xxxx :0
>> 14: ADD TEMP[6].x, CONST[6].xxxx, -IN[3].yyyy
>> 15: RCP TEMP[7].x, TEMP[3].xxxx
>> 16: MUL TEMP[3].x, TEMP[6].xxxx, TEMP[7].xxxx
>> 17: ADD TEMP[6].x, CONST[7].xxxx, -IN[3].yyyy
>> 18: RCP TEMP[7].x, TEMP[3].xxxx
>> 19: MUL TEMP[4].x, TEMP[6].xxxx, TEMP[7].xxxx
>>
>> While after this patch it becomes:
>>
>> 13: UIF TEMP[7].xxxx :0
>> 14: ADD TEMP[7].x, CONST[6].xxxx, -IN[3].yyyy
>> 15: RCP TEMP[8].x, TEMP[3].xxxx
>> 16: MUL TEMP[4].x, TEMP[7].xxxx, TEMP[8].xxxx
>> 17: ADD TEMP[7].x, CONST[7].xxxx, -IN[3].yyyy
>> 18: RCP TEMP[8].x, TEMP[3].xxxx
>> 19: MUL TEMP[5].x, TEMP[7].xxxx, TEMP[8].xxxx
>>
>> Most importantly note that in the first example, the second RCP is done
>> on the result of the MUL while in the second, the second RCP should have
>> the same value as the first. Looking at the GLSL source, it is apparent
>> that both of the RCP's should have had the same source.
>>
>> Looking at what's going on, the GLSL looks something like
>>
>> float tmin_8;
>> float tmin_10;
>> tmin_10 = tmin_8;
>> ... lots of code ...
>> tmin_8 = tmpvar_17;
>> ... more code that never looks at tmin_8 ...
>>
>> And so we end up with a last_read somewhere at the beginning, and a
>> first_write somewhere at the bottom. For some reason DCE doesn't remove
>> it, but even if that were fixed, DCE doesn't handle 100% of cases, esp
>> including loops.
>>
>> With the last_read somewhere high up, we overwrite the previously
>> correct (and large) last_read with a low one, and then proceed to decide
>> to merge all kinds of junk onto this temp.
>>
>> As a result, we should treat a write as a last_read for the purpose of
>> determining the live range.
>>
>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>> Cc: mesa-stable at lists.freedesktop.org
>
> I think you've convinced me this is right, I'd like to know why DCE
> doesn't trash
> that shader better, but I'm happy for this to go in.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
Thanks! I'm going to leave this on the list until tomorrow in case
anyone else has feedback... these things are subtle and I don't want
to be doing the wrong thing. However I really do believe it's the
correct fix to deal with WaW hazards that otherwise appear.
-ilia
More information about the mesa-stable
mailing list