[Beignet] [PATCH] Fix the bug of multi deleting of load instruction in lowering

Zhigang Gong zhigang.gong at linux.intel.com
Sun Jan 26 01:16:04 PST 2014


LGTM, pushed, thanks.

On Mon, Jan 20, 2014 at 11:28:43AM +0800, junyan.he at inbox.com wrote:
> From: Junyan He <junyan.he at linux.intel.com>
> 
> When the load instruction has multi-value destinations, the load
> instruction in buildConstantPush function will be replaced many
> times and which can cause the potential problems.
> ---
>  backend/src/ir/instruction.cpp |    9 +++++++++
>  backend/src/ir/instruction.hpp |    2 ++
>  backend/src/ir/lowering.cpp    |   12 +++++++++---
>  3 files changed, 20 insertions(+), 3 deletions(-)
> 
> diff --git a/backend/src/ir/instruction.cpp b/backend/src/ir/instruction.cpp
> index 5e3cd84..a3e096f 100644
> --- a/backend/src/ir/instruction.cpp
> +++ b/backend/src/ir/instruction.cpp
> @@ -1442,6 +1442,15 @@ END_FUNCTION(Instruction, Register)
>      fn.deleteInstruction(this);
>    }
>  
> +  void Instruction::insert(Instruction *prev, Instruction ** new_ins) {
> +    Function &fn = prev->getFunction();
> +    Instruction *insn = fn.newInstruction(*this);
> +    insn->parent = prev->parent;
> +    append(insn, prev);
> +    if (new_ins)
> +      *new_ins = insn;
> +  }
> +
>    bool Instruction::hasSideEffect(void) const {
>      return opcode == OP_STORE ||
>             opcode == OP_TYPED_WRITE ||
> diff --git a/backend/src/ir/instruction.hpp b/backend/src/ir/instruction.hpp
> index c827b9a..696d1d9 100644
> --- a/backend/src/ir/instruction.hpp
> +++ b/backend/src/ir/instruction.hpp
> @@ -170,6 +170,8 @@ namespace ir {
>      void replace(Instruction *other) const;
>      /*! Remove the instruction from the instruction stream */
>      void remove(void);
> +    /* Insert the instruction after the previous one. */
> +    void insert(Instruction *prev, Instruction ** new_ins = NULL);
>      /*! Indicates if the instruction belongs to instruction type T. Typically, T
>       *  can be BinaryInstruction, UnaryInstruction, LoadInstruction and so on
>       */
> diff --git a/backend/src/ir/lowering.cpp b/backend/src/ir/lowering.cpp
> index 49b6e06..638b15b 100644
> --- a/backend/src/ir/lowering.cpp
> +++ b/backend/src/ir/lowering.cpp
> @@ -225,6 +225,8 @@ namespace ir {
>      for (const auto &loadAddImm : seq) {
>        LoadInstruction *load = cast<LoadInstruction>(loadAddImm.load);
>        const uint32_t valueNum = load->getValueNum();
> +      bool replaced = false;
> +      Instruction *ins_after = load; // the instruction to insert after.
>        for (uint32_t valueID = 0; valueID < valueNum; ++valueID) {
>          const Type type = load->getValueType();
>          const RegisterFamily family = getFamily(type);
> @@ -249,12 +251,16 @@ namespace ir {
>          // register is never written. We must however support the register
>          // replacement in the instruction interface to be able to patch all the
>          // instruction that uses "reg"
> -        const Instruction mov = ir::MOV(type, reg, pushed);
> -        mov.replace(load);
> -        dead.insert(load);
> +        Instruction mov = ir::MOV(type, reg, pushed);
> +        mov.insert(ins_after, &ins_after);
> +        replaced = true;
>        }
> +
> +      if (replaced)
> +        dead.insert(load);
>      }
>  
> +    REMOVE_INSN(load)
>      REMOVE_INSN(add)
>      REMOVE_INSN(loadImm)
>    }
> -- 
> 1.7.9.5
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list