<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Thanks for catching this bug.  LGTM.  Please commit. </div><div><br></div><div>Thanks,</div><div>Nadav<br><div><br><div><div>On May 5, 2013, at 8:37 AM, "Kuperstein, Michael M" <<a href="mailto:michael.m.kuperstein@intel.com">michael.m.kuperstein@intel.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Hi Nadav,<br><br>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.<span class="Apple-converted-space"> </span><br>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.<br><br>Thanks,<br>  Michael<br><br>-----Original Message-----<br>From:<span class="Apple-converted-space"> </span><a href="mailto:llvm-commits-bounces@cs.uiuc.edu">llvm-commits-bounces@cs.uiuc.edu</a><span class="Apple-converted-space"> </span>[<a href="mailto:llvm-commits-bounces@cs.uiuc.edu">mailto:llvm-commits-bounces@cs.uiuc.edu</a>] On Behalf Of Nadav Rotem<br>Sent: Wednesday, May 01, 2013 22:19<br>To:<span class="Apple-converted-space"> </span><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>Subject: [llvm] r180871 - Optimize away nop CONCAT_VECTOR nodes.<br><br>Author: nadav<br>Date: Wed May  1 14:18:51 2013<br>New Revision: 180871<br><br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=180871&view=rev">http://llvm.org/viewvc/llvm-project?rev=180871&view=rev</a><br>Log:<br>Optimize away nop CONCAT_VECTOR nodes.<br><br>Optimize CONCAT_VECTOR nodes that merge EXTRACT_SUBVECTOR values that extract from the same vector.<br><br><a href="rdar://13402653">rdar://13402653</a><br>PR15866<br><br><br>Added:<br>   llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll<br>Modified:<br>   llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br><br>Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=180871&r1=180870&r2=180871&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=180871&r1=180870&r2=180871&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed May  1<span class="Apple-converted-space"> </span><br>+++ 14:18:51 2013<br>@@ -9122,6 +9122,45 @@ SDValue DAGCombiner::visitCONCAT_VECTORS<br>  if (ISD::allOperandsUndef(N))<br>    return DAG.getUNDEF(N->getValueType(0));<br><br>+  // Type legalization of vectors and DAG canonicalization of<span class="Apple-converted-space"> </span><br>+ SHUFFLE_VECTOR  // nodes often generate nop CONCAT_VECTOR nodes.<br>+  // Scan the CONCAT_VECTOR operands and look for a CONCAT operations<span class="Apple-converted-space"> </span><br>+ that  // place the incoming vectors at the exact same location.<br>+  SDValue SingleSource = SDValue();<br>+  unsigned PartNumElem =<span class="Apple-converted-space"> </span><br>+ N->getOperand(0).getValueType().getVectorNumElements();<br>+<br>+  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {<br>+    SDValue Op = N->getOperand(i);<br>+<br>+    if (Op.getOpcode() == ISD::UNDEF)<br>+      continue;<br>+<br>+    // Check if this is the identity extract:<br>+    if (Op.getOpcode() != ISD::EXTRACT_SUBVECTOR)<br>+      return SDValue();<br>+<br>+    // Find the single incoming vector for the extract_subvector.<br>+    if (SingleSource.getNode()) {<br>+      if (Op.getOperand(0) != SingleSource)<br>+        return SDValue();<br>+    } else {<br>+      SingleSource = Op.getOperand(0);<br>+    }<br>+<br>+    unsigned IdentityIndex = i * PartNumElem;<br>+    ConstantSDNode *CS = dyn_cast<ConstantSDNode>(Op.getOperand(1));<br>+    // The extract index must be constant.<br>+    if (!CS)<br>+      return SDValue();<br>+    <br>+    // Check that we are reading from the identity index.<br>+    if (CS->getZExtValue() != IdentityIndex)<br>+      return SDValue();<br>+  }<br>+<br>+  if (SingleSource.getNode())<br>+    return SingleSource;<br>+  <br>  return SDValue();<br>}<br><br><br>Added: llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll?rev=180871&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll?rev=180871&view=auto</a><br>==============================================================================<br>--- llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll (added)<br>+++ llvm/trunk/test/CodeGen/ARM/nop_concat_vectors.ll Wed May  1<span class="Apple-converted-space"> </span><br>+++ 14:18:51 2013<br>@@ -0,0 +1,13 @@<br>+; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s<br>+<br>+;CHECK: _foo<br>+;CHECK-NOT: vld1.32<br>+;CHECK-NOT: vst1.32<br>+;CHECK: bx<br>+define void @foo(<16 x i8>* %J) {<br>+  %A = load <16 x i8>* %J<br>+  %T1 = shufflevector <16 x i8> %A, <16 x i8> undef, <8 x i32> <i32 8,<span class="Apple-converted-space"> </span><br>+i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15><br>+  %T2 = shufflevector <8 x i8>  %T1, <8 x i8> undef, <16 x i32> <i32<span class="Apple-converted-space"> </span><br>+undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32<span class="Apple-converted-space"> </span><br>+undef, i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32<span class="Apple-converted-space"> </span><br>+7><br>+  store <16 x i8> %T2, <16 x i8>* %J<br>+  ret void<br>+}<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>---------------------------------------------------------------------<br>Intel Israel (74) Limited<br><br>This e-mail and any attachments may contain confidential material for<br>the sole use of the intended recipient(s). Any review or distribution<br>by others is strictly prohibited. If you are not the intended<br>recipient, please contact the sender and delete all copies.<br><span><concat.diff></span><span><concat.ll></span></div></blockquote></div><br></div></div></body></html>