[Mesa-dev] [PATCH 01/12] nir: Add an "exact" bit to nir_alu_instr

Matt Turner mattst88 at gmail.com
Fri Mar 18 01:29:11 UTC 2016


On Thu, Mar 17, 2016 at 6:21 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> On Thu, Mar 17, 2016 at 6:10 PM, Matt Turner <mattst88 at gmail.com> wrote:
>>
>> On Thu, Mar 17, 2016 at 5:51 PM, Jason Ekstrand <jason at jlekstrand.net>
>> wrote:
>> > ---
>> >  src/compiler/nir/nir.h       | 11 +++++++++++
>> >  src/compiler/nir/nir_clone.c |  1 +
>> >  src/compiler/nir/nir_print.c |  2 ++
>> >  3 files changed, 14 insertions(+)
>> >
>> > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
>> > index 34f31eb..94b981b 100644
>> > --- a/src/compiler/nir/nir.h
>> > +++ b/src/compiler/nir/nir.h
>> > @@ -671,6 +671,17 @@ extern const nir_op_info
>> > nir_op_infos[nir_num_opcodes];
>> >  typedef struct nir_alu_instr {
>> >     nir_instr instr;
>> >     nir_op op;
>> > +
>> > +   /** Indicates that this ALU instruction generates an exact value
>> > +    *
>> > +    * This is kind-of a mixture of GLSL "precise" and "invariant" and
>> > not
>>
>> "kind of" isn't hyphenated.
>
>
> Thanks
>
>>
>> > +    * really equivalent to either.  This indicates that the value
>> > generated by
>> > +    * this operation is high-precision and any code transformations
>> > that touch
>> > +    * it must ensure that the resulting value is bit-for-bit identical
>> > to the
>> > +    * original.
>>
>> I think this is a lot of the problem -- we don't seem to have a good
>> idea of what these keywords mean, concretely.
>>
>> Precise is more clear to me: don't optimize things in such a way as to
>> change the result.
>>
>> Invariant is much less clear to me though. I've read the GLSL spec of
>> course, but can someone give me an example?
>
>
> The best docs I've found are in the ES 3.2 spec.  Basically it means that
> you're allowed to optimize it in an imprecise way as long as you always
> optimize the computation exactly the same way.  One of the places this gets
> us in trouble is in the fma peephole where we decide whether to fuse a
> mul+add or not based on how many users the add has and if they're all mul.
> This means that if we have a mul+add in an invariant expression and another,
> unrelated, user of the mul, it won't get fused.  If you dead-code the other
> unrelated user of the mul, things change and we fuse them.  This is the kind
> of thing that's not allowed.  Does that make more sense?

Yes, thank you. That's a very good example.

I'll take a look at the ESSL 3.2 spec.

> Unfortunately, invariant is horrifically difficult to think about.  It's
> much easier to just implement it as precise which is also a valid way to do
> it.

Yeah.


More information about the mesa-dev mailing list