[Beignet] [PATCH] GBE: fix an ACC register related instruction scheduling bug

Yang, Rong R rong.r.yang at intel.com
Tue Jan 20 23:55:03 PST 2015


LGTM, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Tuesday, January 20, 2015 14:41
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH] GBE: fix an ACC register related instruction
> scheduling bug
> 
> Some instructions modify the ACC register in the gen_context stage which's
> not regonized by current instruction scheduling algorithm. This patch fix this
> bug by checking all the possible SEL_OPs which may change the ACC implicitly.
> 
> The corresponding bugzilla link is as below:
> https://bugs.freedesktop.org/show_bug.cgi?id=88587
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/backend/gen_insn_scheduling.cpp |  4 ++--
> backend/src/backend/gen_insn_selection.cpp  | 14 ++++++++++++++
> backend/src/backend/gen_insn_selection.hpp  |  2 ++
>  3 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/backend/src/backend/gen_insn_scheduling.cpp
> b/backend/src/backend/gen_insn_scheduling.cpp
> index 5538a74..f849c52 100644
> --- a/backend/src/backend/gen_insn_scheduling.cpp
> +++ b/backend/src/backend/gen_insn_scheduling.cpp
> @@ -379,7 +379,7 @@ namespace gbe
>      }
> 
>      // Track writes in accumulators
> -    if (insn.state.accWrEnable) {
> +    if (insn.modAcc()) {
>        const uint32_t index = this->getIndex(GenRegister::acc());
>        this->nodes[index] = node;
>      }
> @@ -517,7 +517,7 @@ namespace gbe
>          tracker.addDependency(node, getFlag(insn), WRITE_AFTER_WRITE);
> 
>        // write-after-write for accumulators
> -      if (insn.state.accWrEnable)
> +      if (insn.modAcc())
>          tracker.addDependency(node, GenRegister::acc(),
> WRITE_AFTER_WRITE);
> 
>        // write-after-write in memory
> diff --git a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index f83edf5..bf33386 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -189,6 +189,20 @@ namespace gbe
>             this->opcode == SEL_OP_DWORD_GATHER;
>    }
> 
> +  bool SelectionInstruction::modAcc(void) const {
> +    return this->opcode == SEL_OP_I64SUB ||
> +           this->opcode == SEL_OP_I64ADD ||
> +           this->opcode == SEL_OP_MUL_HI ||
> +           this->opcode == SEL_OP_HADD ||
> +           this->opcode == SEL_OP_RHADD ||
> +           this->opcode == SEL_OP_I64MUL ||
> +           this->opcode == SEL_OP_I64_MUL_HI ||
> +           this->opcode == SEL_OP_I64MADSAT ||
> +           this->opcode == SEL_OP_I64DIV ||
> +           this->opcode == SEL_OP_I64REM ||
> +           this->opcode == SEL_OP_MACH;  }
> +
>    bool SelectionInstruction::isWrite(void) const {
>      return this->opcode == SEL_OP_UNTYPED_WRITE ||
>             this->opcode == SEL_OP_WRITE64       ||
> diff --git a/backend/src/backend/gen_insn_selection.hpp
> b/backend/src/backend/gen_insn_selection.hpp
> index 7fef11f..8bffb16 100644
> --- a/backend/src/backend/gen_insn_selection.hpp
> +++ b/backend/src/backend/gen_insn_selection.hpp
> @@ -77,6 +77,8 @@ namespace gbe
>      bool isRead(void) const;
>      /*! Does it write memory? */
>      bool isWrite(void) const;
> +    /*! Does it modify the acc register. */
> +    bool modAcc(void) const;
>      /*! Is it a branch instruction (i.e. modify control flow) */
>      bool isBranch(void) const;
>      /*! Is it a label instruction (i.e. change the implicit mask) */
> --
> 1.8.3.2
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list