[Mesa-dev] [PATCH] nv50/ir: fetch indirect sources BEFORE the op that uses them

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Jun 26 19:58:08 UTC 2017


Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

On 06/24/2017 06:50 PM, Ilia Mirkin wrote:
> All the BuildUtil helpers just insert the operation into the current BB.
> So we have to take care that any fetchSrc() operations happen before the
> operation whose setIndirect() it goes into.
> 
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> 
> I don't know how any of this really worked before. I suppose that pre-SSA, we
> could get lucky a lot and have it work out. But order of instructions matters.
> 
>   .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  | 51 ++++++++++++++--------
>   1 file changed, 32 insertions(+), 19 deletions(-)
> 
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> index 0da069b2084..eadfca979ad 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
> @@ -2632,6 +2632,10 @@ Converter::handleLOAD(Value *dst0[4])
>      const int r = tgsi.getSrc(0).getIndex(0);
>      int c;
>      std::vector<Value *> off, src, ldv, def;
> +   Value *ind = NULL;
> +
> +   if (tgsi.getSrc(0).isIndirect(0))
> +      ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
>   
>      switch (tgsi.getSrc(0).getFile()) {
>      case TGSI_FILE_BUFFER:
> @@ -2658,8 +2662,8 @@ Converter::handleLOAD(Value *dst0[4])
>   
>            Instruction *ld = mkLoad(TYPE_U32, dst0[c], sym, off);
>            ld->cache = tgsi.getCacheMode();
> -         if (tgsi.getSrc(0).isIndirect(0))
> -            ld->setIndirect(0, 1, fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
> +         if (ind)
> +            ld->setIndirect(0, 1, ind);
>         }
>         break;
>      case TGSI_FILE_IMAGE: {
> @@ -2681,8 +2685,8 @@ Converter::handleLOAD(Value *dst0[4])
>         ld->tex.mask = tgsi.getDst(0).getMask();
>         ld->tex.format = getImageFormat(code, r);
>         ld->cache = tgsi.getCacheMode();
> -      if (tgsi.getSrc(0).isIndirect(0))
> -         ld->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
> +      if (ind)
> +         ld->setIndirectR(ind);
>   
>         FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi)
>            if (dst0[c] != def[c])
> @@ -2770,6 +2774,10 @@ Converter::handleSTORE()
>      const int r = tgsi.getDst(0).getIndex(0);
>      int c;
>      std::vector<Value *> off, src, dummy;
> +   Value *ind = NULL;
> +
> +   if (tgsi.getDst(0).isIndirect(0))
> +      ind = fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 0);
>   
>      switch (tgsi.getDst(0).getFile()) {
>      case TGSI_FILE_BUFFER:
> @@ -2792,8 +2800,8 @@ Converter::handleSTORE()
>   
>            Instruction *st = mkStore(OP_STORE, TYPE_U32, sym, off, fetchSrc(1, c));
>            st->cache = tgsi.getCacheMode();
> -         if (tgsi.getDst(0).isIndirect(0))
> -            st->setIndirect(0, 1, fetchSrc(tgsi.getDst(0).getIndirect(0), 0, 0));
> +         if (ind)
> +            st->setIndirect(0, 1, ind);
>         }
>         break;
>      case TGSI_FILE_IMAGE: {
> @@ -2811,8 +2819,8 @@ Converter::handleSTORE()
>         st->tex.mask = tgsi.getDst(0).getMask();
>         st->tex.format = getImageFormat(code, r);
>         st->cache = tgsi.getCacheMode();
> -      if (tgsi.getDst(0).isIndirect(0))
> -         st->setIndirectR(fetchSrc(tgsi.getDst(0).getIndirect(0), 0, NULL));
> +      if (ind)
> +         st->setIndirectR(ind);
>         }
>         break;
>      default:
> @@ -2881,6 +2889,10 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
>      std::vector<Value *> srcv;
>      std::vector<Value *> defv;
>      LValue *dst = getScratch();
> +   Value *ind = NULL;
> +
> +   if (tgsi.getSrc(0).isIndirect(0))
> +      ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
>   
>      switch (tgsi.getSrc(0).getFile()) {
>      case TGSI_FILE_BUFFER:
> @@ -2890,23 +2902,21 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
>               continue;
>   
>            Instruction *insn;
> -         Value *off = fetchSrc(1, c), *off2 = NULL;
> +         Value *off = fetchSrc(1, c);
>            Value *sym;
>            if (tgsi.getSrc(1).getFile() == TGSI_FILE_IMMEDIATE)
>               sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c,
>                             tgsi.getSrc(1).getValueU32(c, info));
>            else
>               sym = makeSym(tgsi.getSrc(0).getFile(), r, -1, c, 0);
> -         if (tgsi.getSrc(0).isIndirect(0))
> -            off2 = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
>            if (subOp == NV50_IR_SUBOP_ATOM_CAS)
>               insn = mkOp3(OP_ATOM, ty, dst, sym, fetchSrc(2, c), fetchSrc(3, c));
>            else
>               insn = mkOp2(OP_ATOM, ty, dst, sym, fetchSrc(2, c));
>            if (tgsi.getSrc(1).getFile() != TGSI_FILE_IMMEDIATE)
>               insn->setIndirect(0, 0, off);
> -         if (off2)
> -            insn->setIndirect(0, 1, off2);
> +         if (ind)
> +            insn->setIndirect(0, 1, ind);
>            insn->subOp = subOp;
>         }
>         for (int c = 0; c < 4; ++c)
> @@ -2929,8 +2939,8 @@ Converter::handleATOM(Value *dst0[4], DataType ty, uint16_t subOp)
>         tex->tex.mask = 1;
>         tex->tex.format = getImageFormat(code, r);
>         tex->setType(ty);
> -      if (tgsi.getSrc(0).isIndirect(0))
> -         tex->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
> +      if (ind)
> +         tex->setIndirectR(ind);
>   
>         for (int c = 0; c < 4; ++c)
>            if (dst0[c])
> @@ -3803,12 +3813,14 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
>         break;
>      case TGSI_OPCODE_RESQ:
>         if (tgsi.getSrc(0).getFile() == TGSI_FILE_BUFFER) {
> +         Value *ind = NULL;
> +         if (tgsi.getSrc(0).isIndirect(0))
> +            ind = fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0);
>            geni = mkOp1(OP_BUFQ, TYPE_U32, dst0[0],
>                         makeSym(tgsi.getSrc(0).getFile(),
>                                 tgsi.getSrc(0).getIndex(0), -1, 0, 0));
> -         if (tgsi.getSrc(0).isIndirect(0))
> -            geni->setIndirect(0, 1,
> -                              fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, 0));
> +         if (ind)
> +            geni->setIndirect(0, 1, ind);
>         } else {
>            assert(tgsi.getSrc(0).getFile() == TGSI_FILE_IMAGE);
>   
> @@ -3821,10 +3833,11 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
>            }
>            texi->tex.r = tgsi.getSrc(0).getIndex(0);
>            texi->tex.target = getImageTarget(code, texi->tex.r);
> -         bb->insertTail(texi);
>   
>            if (tgsi.getSrc(0).isIndirect(0))
>               texi->setIndirectR(fetchSrc(tgsi.getSrc(0).getIndirect(0), 0, NULL));
> +
> +         bb->insertTail(texi);
>         }
>         break;
>      case TGSI_OPCODE_IBFE:
> 


More information about the mesa-dev mailing list