On 08/10/2016 11:24 AM, Kenneth Graunke wrote:
> On Wednesday, August 10, 2016 10:02:12 AM PDT Erik Faye-Lund wrote:
>> On Wed, Aug 10, 2016 at 4:30 AM, Kenneth Graunke <kenn...@whitecape.org> 
>> wrote:
>>> On Haswell (GL 3.3):
>>>
>>> total instructions in shared programs: 6208759 -> 6203860 (-0.08%)
>>> instructions in affected programs: 856541 -> 851642 (-0.57%)
>>> helped: 3157
>>> HURT: 113
>>> LOST:   7
>>> GAINED: 15
>>>
>>> On Broadwell (GL 4.4):
>>>
>>> total instructions in shared programs: 11637854 -> 11632016 (-0.05%)
>>> instructions in affected programs: 1055693 -> 1049855 (-0.55%)
>>> helped: 3900
>>> HURT: 176
>>> LOST:   1
>>> GAINED: 18
>>>
>>> Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
>>> ---
>>>  src/compiler/nir/nir_opt_algebraic.py | 4 ++++
>>>  1 file changed, 4 insertions(+)
>>>
>>> diff --git a/src/compiler/nir/nir_opt_algebraic.py 
>>> b/src/compiler/nir/nir_opt_algebraic.py
>>> index 1cf614c..4e9896f 100644
>>> --- a/src/compiler/nir/nir_opt_algebraic.py
>>> +++ b/src/compiler/nir/nir_opt_algebraic.py
>>> @@ -251,6 +251,10 @@ optimizations = [
>>>     (('ieq', 'a@bool', False), ('inot', 'a')),
>>>     (('bcsel', a, True, False), ('ine', a, 0)),
>>>     (('bcsel', a, False, True), ('ieq', a, 0)),
>>> +   (('bcsel@32', a, 1.0, 0.0), ('b2f', ('ine', a, 0))),
>>> +   (('bcsel@32', a, 0.0, 1.0), ('b2f', ('ieq', a, 0))),
>>> +   (('bcsel@32', a, -1.0, -0.0), ('fneg', ('b2f', ('ine', a, 0)))),
>>> +   (('bcsel@32', a, -0.0, -1.0), ('fneg', ('b2f', ('ieq', a, 0)))),
>>>     (('bcsel', True, b, c), b),
>>>     (('bcsel', False, b, c), c),
>>>     # The result of this should be hit by constant propagation and, in the
>>
>> Same as the previous patch, this smells like intel-isms. Hardware that
>> has native bcsel with support for two inline immediates will do better
>> without.
> 
> It definitely feels a little strange replacing a single bcsel with
> a fneg/b2f/ine, as that's three operations instead of one.
> 
> I expect the ine to go away - assuming 'a' is a properly formatted
> boolean (0 or 0xFFFFFFFF), "ine a 0" will just become 'a'.  ieq would
> turn into inot.  If the boolean was a comparison, the inot could be
> folded in - i.e. inot(flt(a,b)) -> fge(a,b).  Or, some GPUs can handle
> boolean negation as a source modifier, so it might be free there too.
> 
> Floating point negation can usually be done as a source modifier.
> 
> For reference, here's a shader snippet from Goat Simulator which
> prompted me to write this optimization:
> 
> const vec4 LocalConst1 = vec4(0.250000, -0.250000, 0.000000, 1.000000);
> 
> void main()
> {
> ...
> InstrHelpTemp.r = ( ( Temporary1.r >= 0.0 ) ? LocalConst1.b : LocalConst1.a );
> ...
> }
> 
> which could be turned into
> 
> InstrHelpTemp.r = float(Temporary1.r < 0.0);
> 
> which seems arguably better, regardless of hardware.

Yeah... I remember looking at that very shader.  I seem to recall that
InstrHelpTemp.r is then compared with 0.0 a little later to generate
another Boolean value. :)

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


Attachment: signature.asc
Description: OpenPGP digital signature

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

Reply via email to