[PATCH] D15515: [AArch64] Add DAG combine for extract extend pattern

James Molloy via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 16 08:55:23 PST 2015


That makes sense to me. LGTM!
On Wed, 16 Dec 2015 at 16:10, Matthew Simpson via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> mssimpso updated this revision to Diff 43012.
> mssimpso added a comment.
>
> Type checking.
>
>
> http://reviews.llvm.org/D15515
>
> Files:
>   lib/Target/AArch64/AArch64ISelLowering.cpp
>   test/CodeGen/AArch64/arm64-neon-copy.ll
>
> Index: test/CodeGen/AArch64/arm64-neon-copy.ll
> ===================================================================
> --- test/CodeGen/AArch64/arm64-neon-copy.ll
> +++ test/CodeGen/AArch64/arm64-neon-copy.ll
> @@ -320,21 +320,20 @@
>    ret i32 %tmp5
>  }
>
> -define i32 @smovx16b(<16 x i8> %tmp1) {
> +define i64 @smovx16b(<16 x i8> %tmp1) {
>  ; CHECK-LABEL: smovx16b:
> -; CHECK: smov {{[xw][0-9]+}}, {{v[0-9]+}}.b[8]
> +; CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.b[8]
>    %tmp3 = extractelement <16 x i8> %tmp1, i32 8
> -  %tmp4 = sext i8 %tmp3 to i32
> -  %tmp5 = add i32 %tmp4, %tmp4
> -  ret i32 %tmp5
> +  %tmp4 = sext i8 %tmp3 to i64
> +  ret i64 %tmp4
>  }
>
> -define i32 @smovx8h(<8 x i16> %tmp1) {
> +define i64 @smovx8h(<8 x i16> %tmp1) {
>  ; CHECK-LABEL: smovx8h:
> -; CHECK: smov {{[xw][0-9]+}}, {{v[0-9]+}}.h[2]
> +; CHECK: smov {{x[0-9]+}}, {{v[0-9]+}}.h[2]
>    %tmp3 = extractelement <8 x i16> %tmp1, i32 2
> -  %tmp4 = sext i16 %tmp3 to i32
> -  ret i32 %tmp4
> +  %tmp4 = sext i16 %tmp3 to i64
> +  ret i64 %tmp4
>  }
>
>  define i64 @smovx4s(<4 x i32> %tmp1) {
> Index: lib/Target/AArch64/AArch64ISelLowering.cpp
> ===================================================================
> --- lib/Target/AArch64/AArch64ISelLowering.cpp
> +++ lib/Target/AArch64/AArch64ISelLowering.cpp
> @@ -8437,6 +8437,25 @@
>      }
>    }
>
> +  const TargetLowering &TLI = DAG.getTargetLoweringInfo();
> +
> +  // If we see (any_extend (extract_vector_element v, i)), we can
> potentially
> +  // remove the extend and promote the extract. We can do this if the
> vector
> +  // type is legal and if the result is sign extended from the element
> type.
> +  if (DCI.isAfterLegalizeVectorOps() && N->getOpcode() == ISD::ANY_EXTEND
> &&
> +      N->hasOneUse() && N->use_begin()->getOpcode() ==
> ISD::SIGN_EXTEND_INREG) {
> +    const SDValue &M = N->getOperand(0);
> +    if (M.getNode()->hasOneUse() && M.getOpcode() ==
> ISD::EXTRACT_VECTOR_ELT) {
> +      EVT DstTy = N->getValueType(0);
> +      EVT SrcTy = cast<VTSDNode>(N->use_begin()->getOperand(1))->getVT();
> +      EVT VecTy = M.getOperand(0).getValueType();
> +      EVT ElmTy = VecTy.getScalarType();
> +      if (TLI.isTypeLegal(VecTy) && SrcTy == ElmTy)
> +        return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(N), DstTy,
> +                           M.getOperand(0), M.getOperand(1));
> +    }
> +  }
> +
>    // This is effectively a custom type legalization for AArch64.
>    //
>    // Type legalization will split an extend of a small, legal, type to a
> larger
> @@ -8467,7 +8486,6 @@
>    // We're only interested in cleaning things up for non-legal vector
> types
>    // here. If both the source and destination are legal, things will just
>    // work naturally without any fiddling.
> -  const TargetLowering &TLI = DAG.getTargetLoweringInfo();
>    EVT ResVT = N->getValueType(0);
>    if (!ResVT.isVector() || TLI.isTypeLegal(ResVT))
>      return SDValue();
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151216/bee6ef49/attachment.html>


More information about the llvm-commits mailing list