<div dir="ltr">This is causing failures <a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/20110">[1]</a> on sanitizer-x86_64-linux like the following:<div><pre style="font-family:"Courier New",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout">/b/sanitizer-x86_64-linux/build/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:17407:44: error: comparison of integers of different signs: 'unsigned int' and 'int' [-Werror,-Wsign-compare]
      if ((SubMask[i] % NumElemsPerConcat) != i)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  ^  ~</span></pre></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Feb 25, 2019 at 8:01 AM Simon Pilgrim via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rksimon<br>
Date: Mon Feb 25 08:02:01 2019<br>
New Revision: 354793<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=354793&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=354793&view=rev</a><br>
Log:<br>
[DAGCombine] Add undef shuffle elt support to partitionShuffleOfConcats<br>
<br>
Support undef shuffle mask indices in the shuffle(concat_vectors, concat_vectors) -> concat_vectors fold<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D58585" rel="noreferrer" target="_blank">https://reviews.llvm.org/D58585</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
    llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=354793&r1=354792&r2=354793&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=354793&r1=354792&r2=354793&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Feb 25 08:02:01 2019<br>
@@ -17366,20 +17366,24 @@ static SDValue partitionShuffleOfConcats<br>
   SDValue N0 = N->getOperand(0);<br>
   SDValue N1 = N->getOperand(1);<br>
   ShuffleVectorSDNode *SVN = cast<ShuffleVectorSDNode>(N);<br>
+  ArrayRef<int> Mask = SVN->getMask();<br>
<br>
   SmallVector<SDValue, 4> Ops;<br>
   EVT ConcatVT = N0.getOperand(0).getValueType();<br>
   unsigned NumElemsPerConcat = ConcatVT.getVectorNumElements();<br>
   unsigned NumConcats = NumElts / NumElemsPerConcat;<br>
<br>
+  auto IsUndefMaskElt = [](int i) { return i == -1; };<br>
+<br>
   // Special case: shuffle(concat(A,B)) can be more efficiently represented<br>
   // as concat(shuffle(A,B),UNDEF) if the shuffle doesn't set any of the high<br>
   // half vector elements.<br>
   if (NumElemsPerConcat * 2 == NumElts && N1.isUndef() &&<br>
-      std::all_of(SVN->getMask().begin() + NumElemsPerConcat,<br>
-                  SVN->getMask().end(), [](int i) { return i == -1; })) {<br>
-    N0 = DAG.getVectorShuffle(ConcatVT, SDLoc(N), N0.getOperand(0), N0.getOperand(1),<br>
-                              makeArrayRef(SVN->getMask().begin(), NumElemsPerConcat));<br>
+      llvm::all_of(Mask.slice(NumElemsPerConcat, NumElemsPerConcat),<br>
+                   IsUndefMaskElt)) {<br>
+    N0 = DAG.getVectorShuffle(ConcatVT, SDLoc(N), N0.getOperand(0),<br>
+                              N0.getOperand(1),<br>
+                              Mask.slice(0, NumElemsPerConcat));<br>
     N1 = DAG.getUNDEF(ConcatVT);<br>
     return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), VT, N0, N1);<br>
   }<br>
@@ -17387,35 +17391,32 @@ static SDValue partitionShuffleOfConcats<br>
   // Look at every vector that's inserted. We're looking for exact<br>
   // subvector-sized copies from a concatenated vector<br>
   for (unsigned I = 0; I != NumConcats; ++I) {<br>
-    // Make sure we're dealing with a copy.<br>
     unsigned Begin = I * NumElemsPerConcat;<br>
-    bool AllUndef = true, NoUndef = true;<br>
-    for (unsigned J = Begin; J != Begin + NumElemsPerConcat; ++J) {<br>
-      if (SVN->getMaskElt(J) >= 0)<br>
-        AllUndef = false;<br>
-      else<br>
-        NoUndef = false;<br>
+    ArrayRef<int> SubMask = Mask.slice(Begin, NumElemsPerConcat);<br>
+<br>
+    // Make sure we're dealing with a copy.<br>
+    if (llvm::all_of(SubMask, IsUndefMaskElt)) {<br>
+      Ops.push_back(DAG.getUNDEF(ConcatVT));<br>
+      continue;<br>
     }<br>
<br>
-    if (NoUndef) {<br>
-      if (SVN->getMaskElt(Begin) % NumElemsPerConcat != 0)<br>
+    int OpIdx = -1;<br>
+    for (int i = 0; i != (int)NumElemsPerConcat; ++i) {<br>
+      if (IsUndefMaskElt(SubMask[i]))<br>
+        continue;<br>
+      if ((SubMask[i] % NumElemsPerConcat) != i)<br>
         return SDValue();<br>
-<br>
-      for (unsigned J = 1; J != NumElemsPerConcat; ++J)<br>
-        if (SVN->getMaskElt(Begin + J - 1) + 1 != SVN->getMaskElt(Begin + J))<br>
-          return SDValue();<br>
-<br>
-      unsigned FirstElt = SVN->getMaskElt(Begin) / NumElemsPerConcat;<br>
-      if (FirstElt < N0.getNumOperands())<br>
-        Ops.push_back(N0.getOperand(FirstElt));<br>
-      else<br>
-        Ops.push_back(N1.getOperand(FirstElt - N0.getNumOperands()));<br>
-<br>
-    } else if (AllUndef) {<br>
-      Ops.push_back(DAG.getUNDEF(N0.getOperand(0).getValueType()));<br>
-    } else { // Mixed with general masks and undefs, can't do optimization.<br>
-      return SDValue();<br>
+      int EltOpIdx = SubMask[i] / NumElemsPerConcat;<br>
+      if (0 <= OpIdx && EltOpIdx != OpIdx)<br>
+        return SDValue();<br>
+      OpIdx = EltOpIdx;<br>
     }<br>
+    assert(0 <= OpIdx && "Unknown concat_vectors op");<br>
+<br>
+    if (OpIdx < (int)N0.getNumOperands())<br>
+      Ops.push_back(N0.getOperand(OpIdx));<br>
+    else<br>
+      Ops.push_back(N1.getOperand(OpIdx - N0.getNumOperands()));<br>
   }<br>
<br>
   return DAG.getNode(ISD::CONCAT_VECTORS, SDLoc(N), VT, Ops);<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll?rev=354793&r1=354792&r2=354793&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll?rev=354793&r1=354792&r2=354793&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/subvector-broadcast.ll Mon Feb 25 08:02:01 2019<br>
@@ -1676,20 +1676,12 @@ define <8 x float> @broadcast_v8f32_v2f3<br>
 }<br>
<br>
 define <8 x double> @broadcast_v8f64_v2f64_u1u10101(<2 x double>* %vp) {<br>
-; X32-AVX1-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
-; X32-AVX1:       # %bb.0:<br>
-; X32-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; X32-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]<br>
-; X32-AVX1-NEXT:    vmovaps %ymm0, %ymm1<br>
-; X32-AVX1-NEXT:    retl<br>
-;<br>
-; X32-AVX2-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
-; X32-AVX2:       # %bb.0:<br>
-; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
-; X32-AVX2-NEXT:    vmovaps (%eax), %xmm0<br>
-; X32-AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1<br>
-; X32-AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,2,1]<br>
-; X32-AVX2-NEXT:    retl<br>
+; X32-AVX-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
+; X32-AVX:       # %bb.0:<br>
+; X32-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]<br>
+; X32-AVX-NEXT:    vmovaps %ymm0, %ymm1<br>
+; X32-AVX-NEXT:    retl<br>
 ;<br>
 ; X32-AVX512-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
 ; X32-AVX512:       # %bb.0:<br>
@@ -1697,18 +1689,11 @@ define <8 x double> @broadcast_v8f64_v2f<br>
 ; X32-AVX512-NEXT:    vbroadcastf32x4 {{.*#+}} zmm0 = mem[0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3]<br>
 ; X32-AVX512-NEXT:    retl<br>
 ;<br>
-; X64-AVX1-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
-; X64-AVX1:       # %bb.0:<br>
-; X64-AVX1-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]<br>
-; X64-AVX1-NEXT:    vmovaps %ymm0, %ymm1<br>
-; X64-AVX1-NEXT:    retq<br>
-;<br>
-; X64-AVX2-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
-; X64-AVX2:       # %bb.0:<br>
-; X64-AVX2-NEXT:    vmovaps (%rdi), %xmm0<br>
-; X64-AVX2-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm1<br>
-; X64-AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,1,2,1]<br>
-; X64-AVX2-NEXT:    retq<br>
+; X64-AVX-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
+; X64-AVX:       # %bb.0:<br>
+; X64-AVX-NEXT:    vbroadcastf128 {{.*#+}} ymm0 = mem[0,1,0,1]<br>
+; X64-AVX-NEXT:    vmovaps %ymm0, %ymm1<br>
+; X64-AVX-NEXT:    retq<br>
 ;<br>
 ; X64-AVX512-LABEL: broadcast_v8f64_v2f64_u1u10101:<br>
 ; X64-AVX512:       # %bb.0:<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>