[Beignet] [PATCH] GBE: Fixed a bug in byte gather/scatter.

Zhigang Gong zhigang.gong at linux.intel.com
Wed May 22 20:10:41 PDT 2013


Please try this patch with your original kernel which is use a short element
in a structure. 

> -----Original Message-----
> From: beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop.org
>
[mailto:beignet-bounces+zhigang.gong=linux.intel.com at lists.freedesktop.org]
> On Behalf Of Zhigang Gong
> Sent: Thursday, May 23, 2013 11:11 AM
> To: beignet at lists.freedesktop.org
> Cc: Zhigang Gong
> Subject: [Beignet] [PATCH] GBE: Fixed a bug in byte gather/scatter.
> 
> We can't just use the alignment to determine whether use the
gather/scatter
> or not. As for a short type, the compiler may also generate a 4 alignment,
thus
> it will trigger this bug.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at linux.intel.com>
> ---
>  backend/src/backend/gen_insn_selection.cpp | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index 08bc6af..561e32f 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -1665,14 +1665,13 @@ namespace gbe
> 
>      void emitByteGather(Selection::Opaque &sel,
>                          const ir::LoadInstruction &insn,
> +                        const uint32_t elemSize,
>                          GenRegister address,
>                          GenRegister value,
>                          uint32_t bti) const
>      {
>        using namespace ir;
>        GBE_ASSERT(insn.getValueNum() == 1);
> -      const Type type = insn.getValueType();
> -      const uint32_t elemSize = getByteScatterGatherSize(type);
>        const uint32_t simdWidth = sel.ctx.getSimdWidth();
> 
>        // We need a temporary register if we read bytes or words @@
> -1711,13 +1710,15 @@ namespace gbe
>                   insn.getAddressSpace() == MEM_PRIVATE ||
>                   insn.getAddressSpace() == MEM_LOCAL);
>        GBE_ASSERT(sel.ctx.isScalarReg(insn.getValue(0)) == false);
> +      const Type type = insn.getValueType();
> +      const uint32_t elemSize = getByteScatterGatherSize(type);
>        if (insn.getAddressSpace() == MEM_CONSTANT)
>          this->emitIndirectMove(sel, insn, address);
> -      else if (insn.isAligned() == true)
> +      else if (insn.isAligned() == true && elemSize ==
> + GEN_BYTE_SCATTER_DWORD)
>          this->emitUntypedRead(sel, insn, address, space == MEM_LOCAL ?
> 0xfe : 0x00);
>        else {
>          const GenRegister value = sel.selReg(insn.getValue(0));
> -        this->emitByteGather(sel, insn, address, value, space ==
> MEM_LOCAL ? 0xfe : 0x01);
> +        this->emitByteGather(sel, insn, elemSize, address, value, space
> + == MEM_LOCAL ? 0xfe : 0x01);
>        }
>        return true;
>      }
> @@ -1745,13 +1746,12 @@ namespace gbe
> 
>      void emitByteScatter(Selection::Opaque &sel,
>                           const ir::StoreInstruction &insn,
> +                         const uint32_t elemSize,
>                           GenRegister addr,
>                           GenRegister value,
>                           uint32_t bti) const
>      {
>        using namespace ir;
> -      const Type type = insn.getValueType();
> -      const uint32_t elemSize = getByteScatterGatherSize(type);
>        const uint32_t simdWidth = sel.ctx.getSimdWidth();
>        const GenRegister dst = value;
> 
> @@ -1771,12 +1771,14 @@ namespace gbe
>        using namespace ir;
>        const AddressSpace space = insn.getAddressSpace();
>        const uint32_t bti = space == MEM_LOCAL ? 0xfe : 0x01;
> -      if (insn.isAligned() == true)
> +      const Type type = insn.getValueType();
> +      const uint32_t elemSize = getByteScatterGatherSize(type);
> +      if (insn.isAligned() == true && elemSize ==
> + GEN_BYTE_SCATTER_DWORD)
>          this->emitUntypedWrite(sel, insn, bti);
>        else {
>          const GenRegister address = sel.selReg(insn.getAddress());
>          const GenRegister value = sel.selReg(insn.getValue(0));
> -        this->emitByteScatter(sel, insn, address, value, bti);
> +        this->emitByteScatter(sel, insn, elemSize, address, value,
> + bti);
>        }
>        return true;
>      }
> --
> 1.7.11.7
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet



More information about the Beignet mailing list