[Beignet] [PATCH] GBE: we should allocate register for ExtractElement insn.

Zhigang Gong zhigang.gong at linux.intel.com
Sun Dec 22 23:35:09 PST 2013


Thanks for the comments, I just refine the comment as below:

The case which trigger this corner case is as below:
Clang/llvm may generate some code similar to the following IRs:

... (there is no definition of %7)
  br label 2

label1:
  %10 = add  i32 %7, %6
  ...
  ret

label2:
  %8 = load <4 x i8> addrspace(1)* %3, align 4, !tbaa !1
  %7 = extractelement <4 x i8> %8, i32 0
  ...
  br label1

The value %7 is assigned after label2 but is referred at label1.
>From the control flow, the IRs is valid. As the reference will
be executed after the assignment. But the previous implementation
doesn't allocate proxyvalue for %7, that's the root cause why
it triggers an assert when visit the instruction %10 = add i32 %7, %6.


On Fri, Dec 20, 2013 at 09:35:27AM +0800, Zhigang Gong wrote:
> We should allocate register when we firstly visit ExtractElement
> instruction, as we may refer the value before we visit that instruction
> at the emit instruction pass.
> 
> The case which trigger this corner case is as below:
> Clang/llvm may generate some code similar to the following IRs:
> 
> ... (there is no definition of %7)
>   br label 2
> 
> label1:
>   %10 = add  %7, %6
>   ...
>   ret
> 
> label2:
>   %7 = ...
>   br label1
> 
> The value %7 is assigned after label2 but is referred at label1.
> From the control flow, the IRs is valid. As the reference will
> be executed after the assignment.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/llvm/llvm_gen_backend.cpp |    6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp
> index 1316d4b..bfba825 100644
> --- a/backend/src/llvm/llvm_gen_backend.cpp
> +++ b/backend/src/llvm/llvm_gen_backend.cpp
> @@ -1842,8 +1842,7 @@ namespace gbe
>      }
>    }
>  
> -  void GenWriter::regAllocateExtractElement(ExtractElementInst &I) {}
> -  void GenWriter::emitExtractElement(ExtractElementInst &I) {
> +  void GenWriter::regAllocateExtractElement(ExtractElementInst &I) {
>      Value *vec = I.getVectorOperand();
>      const Value *index = I.getIndexOperand();
>      const ConstantInt *c = dyn_cast<ConstantInt>(index);
> @@ -1852,6 +1851,9 @@ namespace gbe
>      regTranslator.newValueProxy(vec, &I, i, 0);
>    }
>  
> +  void GenWriter::emitExtractElement(ExtractElementInst &I) {
> +  }
> +
>    void GenWriter::regAllocateShuffleVectorInst(ShuffleVectorInst &I) {}
>    void GenWriter::emitShuffleVectorInst(ShuffleVectorInst &I) {}
>  
> -- 
> 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