[llvm] r180871 - Optimize away nop CONCAT_VECTOR nodes.
Nadav Rotem
nrotem at apple.com
Sun May 5 15:04:21 PDT 2013
Thanks for catching this bug. LGTM. Please commit.
Thanks,
Nadav
On May 5, 2013, at 8:37 AM, "Kuperstein, Michael M" <michael.m.kuperstein at intel.com> wrote:
> Hi Nadav,
>
> This breaks a case where a concat_vector has a single non-undef source, but concatenates it with an undef in order to extend the vector. I'm attaching a test-case and a proposed patch.
> Only ran x86 tests, not ARM, can you check this doesn't break the original issue? If it looks ok, I'll add the test to the patch and commit.
>
> Thanks,
> Michael
>
> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Nadav Rotem
> Sent: Wednesday, May 01, 2013 22:19
> To: llvm-commits at cs.uiuc.edu
> Subject: [llvm] r180871 - Optimize away nop CONCAT_VECTOR nodes.
>
> Author: nadav
> Date: Wed May 1 14:18:51 2013
> New Revision: 180871
>
> URL: http://llvm.org/viewvc/llvm-project?rev=180871&view=rev
> Log:
> Optimize away nop CONCAT_VECTOR nodes.
>
> Optimize CONCAT_VECTOR nodes that merge EXTRACT_SUBVECTOR values that extract from the same vector.
>
> rdar://13402653
> PR15866
>
>
> Added:
> llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll
> Modified:
> llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=180871&r1=180870&r2=180871&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed May 1
> +++ 14:18:51 2013
> @@ -9122,6 +9122,45 @@ SDValue DAGCombiner::visitCONCAT_VECTORS
> if (ISD::allOperandsUndef(N))
> return DAG.getUNDEF(N->getValueType(0));
>
> + // Type legalization of vectors and DAG canonicalization of
> + SHUFFLE_VECTOR // nodes often generate nop CONCAT_VECTOR nodes.
> + // Scan the CONCAT_VECTOR operands and look for a CONCAT operations
> + that // place the incoming vectors at the exact same location.
> + SDValue SingleSource = SDValue();
> + unsigned PartNumElem =
> + N->getOperand(0).getValueType().getVectorNumElements();
> +
> + for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
> + SDValue Op = N->getOperand(i);
> +
> + if (Op.getOpcode() == ISD::UNDEF)
> + continue;
> +
> + // Check if this is the identity extract:
> + if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR)
> + return SDValue();
> +
> + // Find the single incoming vector for the extract_subvector.
> + if (SingleSource.getNode()) {
> + if (Op.getOperand(0) != SingleSource)
> + return SDValue();
> + } else {
> + SingleSource = Op.getOperand(0);
> + }
> +
> + unsigned IdentityIndex = i * PartNumElem;
> + ConstantSDNode *CS = dyn_cast<ConstantSDNode>(Op.getOperand(1));
> + // The extract index must be constant.
> + if (!CS)
> + return SDValue();
> +
> + // Check that we are reading from the identity index.
> + if (CS->getZExtValue() != IdentityIndex)
> + return SDValue();
> + }
> +
> + if (SingleSource.getNode())
> + return SingleSource;
> +
> return SDValue();
> }
>
>
> Added: llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll?rev=180871&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll Wed May 1
> +++ 14:18:51 2013
> @@ -0,0 +1,13 @@
> +; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s
> +
> +;CHECK: _foo
> +;CHECK-NOT: vld1.32
> +;CHECK-NOT: vst1.32
> +;CHECK: bx
> +define void @foo(<16 x i8>* %J) {
> + %A = load <16 x i8>* %J
> + %T1 = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 8,
> +i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
> + %T2 = shufflevector <8 x i8> %T1, <8 x i8> undef, <16 x i32> <i32
> +undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32
> +undef, i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32
> +7>
> + store <16 x i8> %T2, <16 x i8>* %J
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> ---------------------------------------------------------------------
> 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.
> <concat.diff><concat.ll>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130505/2e1a7ae0/attachment.html>
More information about the llvm-commits
mailing list