[Mesa-dev] [PATCH v3 39/42] intel/compiler: remove MAD/LRP algebraic optimizations from the backend

Iago Toral itoral at igalia.com
Fri Jan 18 07:29:45 UTC 2019


On Thu, 2019-01-17 at 22:31 -0600, Jason Ekstrand wrote:
> On Thu, Jan 17, 2019 at 6:42 PM Matt Turner <mattst88 at gmail.com>
> wrote:
> > On Tue, Jan 15, 2019 at 5:54 AM Iago Toral Quiroga <
> > itoral at igalia.com> wrote:
> > 
> > >
> > 
> > > NIR already has these so they are redundant. A run of shader-db
> > confirms
> > 
> > > that the only cases where these backend optimizations are
> > activated
> > 
> > > are some Tomb Raider shaders where the affected variables are
> > qualified
> > 
> > > as "precise", which is why NIR won't apply them and why the
> > backend
> > 
> > > shouldn't either (so it is actually a bug).
> > 
> > 
> > 
> > Which of the six optimizations that you're removing were
> > responsible
> > 
> > for the change? I ask because...
> 
> If it's one of the precise ones, we should port it to NIR...
> 
> > >
> > 
> > > Suggested-by: Jason Ekstrand <jason at jlekstrand.net>
> > 
> > > ---
> > 
> > >  src/intel/compiler/brw_fs.cpp | 37 ---------------------------
> > --------
> > 
> > >  1 file changed, 37 deletions(-)
> > 
> > >
> > 
> > > diff --git a/src/intel/compiler/brw_fs.cpp
> > b/src/intel/compiler/brw_fs.cpp
> > 
> > > index 77c955ac435..e7f5a8822a3 100644
> > 
> > > --- a/src/intel/compiler/brw_fs.cpp
> > 
> > > +++ b/src/intel/compiler/brw_fs.cpp
> > 
> > > @@ -2568,16 +2568,6 @@ fs_visitor::opt_algebraic()
> > 
> > >              break;
> > 
> > >           }
> > 
> > >           break;
> > 
> > > -      case BRW_OPCODE_LRP:
> > 
> > > -         if (inst->src[1].equals(inst->src[2])) {
> > 
> > > -            inst->opcode = BRW_OPCODE_MOV;
> > 
> > > -            inst->src[0] = inst->src[1];
> > 
> > > -            inst->src[1] = reg_undef;
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;
> > 
> > > -            break;
> > 
> > 
> > 
> > I'm not sure whether this is imprecise, and...
> 
> Doesn't work for NaN or either inf, at least not unles inf - inf == 0
> which I don't think it is.

This exists in NIR algebraic and is marked as inexact there (plus it is
not triggered by anything in shader-db)
> > > -         }
> > 
> > > -         break;
> > 
> > >        case BRW_OPCODE_CMP:
> > 
> > >           if ((inst->conditional_mod == BRW_CONDITIONAL_Z ||
> > 
> > >                inst->conditional_mod == BRW_CONDITIONAL_NZ) &&
> > 
> > > @@ -2654,33 +2644,6 @@ fs_visitor::opt_algebraic()
> > 
> > >              }
> > 
> > >           }
> > 
> > >           break;
> > 
> > > -      case BRW_OPCODE_MAD:
> > 
> > > -         if (inst->src[1].is_zero() || inst->src[2].is_zero()) {
> > 
> > > -            inst->opcode = BRW_OPCODE_MOV;
> > 
> > > -            inst->src[1] = reg_undef;
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;
> > 
> > > -         } else if (inst->src[0].is_zero()) {
> > 
> > > -            inst->opcode = BRW_OPCODE_MUL;
> > 
> > > -            inst->src[0] = inst->src[2];
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;

I believe these were the only cases triggered by the Tomb Raider
shaders. These optimizations exist in NIR and  are marked as imprecise
there too.
> > > -         } else if (inst->src[1].is_one()) {
> > 
> > > -            inst->opcode = BRW_OPCODE_ADD;
> > 
> > > -            inst->src[1] = inst->src[2];
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;
> > 
> > > -         } else if (inst->src[2].is_one()) {
> > 
> > > -            inst->opcode = BRW_OPCODE_ADD;
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;

These also exist in NIR, but I see they are not marked as imprecise
there, not sure why, looks like a bug to me right?
> > > -         } else if (inst->src[1].file == IMM && inst-
> > >src[2].file == IMM) {
> > 
> > > -            inst->opcode = BRW_OPCODE_ADD;
> > 
> > > -            inst->src[1].f *= inst->src[2].f;
> > 
> > > -            inst->src[2] = reg_undef;
> > 
> > > -            progress = true;
> > 
> > 

This one doesn't exist in NIR but it clearly breaks precise
requirements since it its manually breaking  MAD into MUL + ADD, which
has different precision.
> or this one.
> 
> Yes, it is.  Part of the point of FMA is that it's more precise than
> mul+add because the mul is done with extra precision and added to
> src[0] in high-precision before the final rounding.  This
> optimization explicitly breaks the MAD into mul+add.--Jason
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190118/9b00b2b7/attachment.html>


More information about the mesa-dev mailing list