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

jingu@codeplay.com via llvm-dev llvm-dev at lists.llvm.org
Mon Sep 18 05:57:12 PDT 2017


I think the EXTRACT_VECTOR_ELT's output should be same with the load's 
output. It means If the element's size is less than 8 bit, we need 
Truncate after load. I guessed the load with less than 8bit would be 
lowered. It could be better to add truncation explicitly.

Thanks,

JinGu Kang


On 18/09/17 13:40, Demikhovsky, Elena wrote:
>
>
> > so I think we need to use non-extending load for element size less 
> than 8bit on "DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT" like 
> this roughly.
>
> > if 
> (N->getOperand(0).getValueType().getVectorElementType().getSizeInBits() 
> < 8) {
> >   return DAG.getLoad(N->getValueType(0), dl, Store, StackPtr, 
> MachinePointerInfo());
> > } else {
> >    return DAG.getExtLoad(ISD::EXTLOAD, dl, N->getValueType(0), 
> Store, StackPtr, MachinePointerInfo(), EltVT);
> > }
>
> I assume that we need the opposite -
>
> if (.. < 8)
>
> getExtLoad // VT should be MVT::i8, MemVT should be MVT::i1
>
> else
>
> getLoad
>
> -*/ Elena/*
>
> *From:*jingu at codeplay.com [mailto:jingu at codeplay.com]
> *Sent:* Monday, September 18, 2017 13:40
> *To:* Demikhovsky, Elena <elena.demikhovsky at intel.com>; 
> daniel_l_sanders at apple.com <daniel_l_sanders at apple.com>; Jon 
> Chesterfield <jonathanchesterfield at gmail.com>
> *Cc:* llvm-dev at lists.llvm.org
> *Subject:* Re: Question about 
> 'DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT'
>
> um... In order to reproduce the issue, we need to add 'i1' register 
> class and avoid all vector register class on TargetLowering class... I 
> am getting the issue on my custom target. I will try to find the 
> existing target to reproduce the issuet but I am not sure whether the 
> existing targets can reproduce the issue or not...
>
> Thanks,
>
> JinGu Kang
>
> On 17/09/17 06:40, Demikhovsky, Elena wrote:
>
>     Please open a bugzilla ticket and attach your testcase. It will
>     allow us to debug and fix the problem.
>
>     Thanks
>
>     -*/ Elena/*
>
>     *From:*JinGu [mailto:jingu at codeplay.com]
>     *Sent:* Saturday, September 16, 2017 00:38
>     *To:* Demikhovsky, Elena <elena.demikhovsky at intel.com>
>     <mailto:elena.demikhovsky at intel.com>; daniel_l_sanders at apple.com
>     <mailto:daniel_l_sanders at apple.com> <daniel_l_sanders at apple.com>
>     <mailto:daniel_l_sanders at apple.com>; Jon Chesterfield
>     <jonathanchesterfield at gmail.com>
>     <mailto:jonathanchesterfield at gmail.com>
>     *Cc:* llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     *Subject:* Re: Question about
>     'DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT'
>
>     Hi Elena,
>
>     Thanks for your response.
>
>     The store is ok but the extending load generates assertion after
>     the store because MemVT is i8 and VT is i1 on following line.
>
>
>     assert(MemVT.getScalarType().bitsLT(VT.getScalarType()) && "Should
>     only be an extending load, not truncating!")
>
>     so I think we need to use non-extending load for element size less
>     than 8bit on
>     "DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT" like this roughly.
>
>     if
>     (N->getOperand(0).getValueType().getVectorElementType().getSizeInBits()
>     < 8) {
>       return DAG.getLoad(N->getValueType(0), dl, Store, StackPtr,
>     MachinePointerInfo());
>     } else {
>        return DAG.getExtLoad(ISD::EXTLOAD, dl, N->getValueType(0),
>     Store, StackPtr, MachinePointerInfo(), EltVT);
>     }
>
>     How do you think about it?
>
>     Thanks,
>
>     JinGu Kang
>
>     On 15/09/2017 18:42, Demikhovsky, Elena wrote:
>
>             extends the elements to 8bit and stores them on stack.
>
>         Store is responsible for zero-extend. This is the policy...
>
>           
>
>         -  Elena
>
>           
>
>           
>
>         -----Original Message-----
>
>         From:jingu at codeplay.com <mailto:jingu at codeplay.com>  [mailto:jingu at codeplay.com]
>
>         Sent: Friday, September 15, 2017 17:45
>
>         To:llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>; Demikhovsky, Elena<elena.demikhovsky at intel.com> <mailto:elena.demikhovsky at intel.com>;daniel_l_sanders at apple.com <mailto:daniel_l_sanders at apple.com>
>
>         Subject: Re: Question about 'DAGTypeLegalizer::SplitVecOp_EXTRACT_VECTOR_ELT'
>
>           
>
>         Can someone give the comment about it please?
>
>           
>
>         Thanks,
>
>           
>
>         JinGu Kang
>
>           
>
>           
>
>         On 14/09/17 12:05,jingu at codeplay.com <mailto: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
>
>               
>
>           
>
>         ---------------------------------------------------------------------
>
>         Intel Israel (74) Limited
>
>           
>
>         This e-mail and any attachments may contain confidential material for
>
>         the sole use of the intended recipient(s). Any review or distribution
>
>         by others is strictly prohibited. If you are not the intended
>
>         recipient, please contact the sender and delete all copies.
>
>     ---------------------------------------------------------------------
>     Intel Israel (74) Limited
>
>     This e-mail and any attachments may contain confidential material for
>     the sole use of the intended recipient(s). Any review or distribution
>     by others is strictly prohibited. If you are not the intended
>     recipient, please contact the sender and delete all copies.
>
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
>
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170918/c56926ce/attachment.html>


More information about the llvm-dev mailing list