[llvm-dev] Question about 'DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT'

jingu@codeplay.com via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 15 07:45:05 PDT 2017


Can someone give the comment about it please?

Thanks,

JinGu Kang


On 14/09/17 12:05, jingu at codeplay.com wrote:
> Hi All,
>
> I have a question about splitting 'EXTRACT_VECTOR_ELT' with 'v2i1'. I 
> have a llvm IR code snippet as following:
>
> llvm IR code snippet:
>
> for.body:                                         ; preds = %entry, 
> %for.cond
>   %i.022 = phi i32 [ 0, %entry ], [ %inc, %for.cond ]
>   %0 = icmp ne <2 x i32> %vecinit1, <i32 0, i32 -23>
>   %1 = extractelement <2 x i1> %0, i32 %i.022
>   %vecext4 = extractelement <2 x i32> %vecinit1, i32 %i.022
>   %vecext5 = extractelement <2 x i32> <i32 0, i32 -23>, i32 %i.022
>   %cmp6 = icmp ne i32 %vecext4, %vecext5
>   %cmp7 = xor i1 %1, %cmp6
>
> ...
>
> and the SelectionDAG before TypeLegalizer is like this.
>
>   t0: ch = EntryToken
>   t2: i32,ch = CopyFromReg t0, Register:i32 %vreg0
>   t3: ch = ValueType:i32
>       t5: i32,ch = CopyFromReg t2:1, Register:i32 %vreg1
>     t7: i32 = AssertZext t5, ValueType:ch:i1
>   t8: v2i32 = BUILD_VECTOR t2, t7
>   t11: v2i32 = BUILD_VECTOR Constant:i32<0>, Constant:i32<-23>
>   t15: i32,ch = CopyFromReg t0, Register:i32 %vreg2
>           t22: i32 = add t15, Constant:i32<1>
>         t24: ch = CopyToReg t0, Register:i32 %vreg3, t22
>         t27: ch = CopyToReg t0, Register:i32 %vreg8, Constant:i32<-1>
>       t31: ch = TokenFactor t24, t27
>             t13: v2i1 = setcc t8, t11, setne:ch
>           t16: i1 = extract_vector_elt t13, t15
>             t17: i32 = extract_vector_elt t8, t15
>             t18: i32 = extract_vector_elt t11, t15
>           t19: i1 = setcc t17, t18, setne:ch
>         t20: i1 = xor t16, t19
>
> ...
>
> I have not added any vector register class so 'DAGTypeLegalizer' tries 
> to split the "t16: i1 = extract_vector_elt t13, t15" because  t13's 
> result type is 'v2i1'. If the size of vector element is less than 
> 8bit, 'DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT()' function 
> extends the elements to 8bit and stores them on stack. Finally, the 
> function generates 'ExtLoad' to load specific element. But if the 
> element's size is less than 8bit, I think it could be wrong. It looks 
> it needs just 'Load' or "Load and Truncate" to match the result type 
> of 'EXTRACT_VECTOR_ELT'. How do you think about it? If I missed 
> something, please let me know.
>
> Thanks,
>
> JinGu Kang
>



More information about the llvm-dev mailing list