<div dir="ltr">Kevin, this caused every bot to fail. It trivially fails 'make check' or any variant thereof.<div><br></div><div>Please check stuff before committing. Also, you can check on IRC to see if build bots hit this. It's been about 45 minutes without an update or a fix, so I'm going to revert until you can clean it up.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Jan 19, 2014 at 11:32 PM, Kevin Qin <span dir="ltr"><<a href="mailto:Kevin.Qin@arm.com" target="_blank">Kevin.Qin@arm.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kevinqin<br>
Date: Mon Jan 20 01:32:26 2014<br>
New Revision: 199628<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=199628&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=199628&view=rev</a><br>
Log:<br>
[AArch64 NEON] Fix a bug caused by undef lane when generating VEXT.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp<br>
    llvm/trunk/test/CodeGen/AArch64/neon-extract.ll<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=199628&r1=199627&r2=199628&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=199628&r1=199627&r2=199628&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp Mon Jan 20 01:32:26 2014<br>
@@ -4654,22 +4654,28 @@ AArch64TargetLowering::LowerVECTOR_SHUFF<br>
   // it into NEON_VEXTRACT.<br>
   if (V1EltNum == Length) {<br>
     // Check if the shuffle mask is sequential.<br>
-    bool IsSequential = true;<br>
-    int CurMask = ShuffleMask[0];<br>
-    for (int I = 0; I < Length; ++I) {<br>
-      if (ShuffleMask[I] != CurMask) {<br>
-        IsSequential = false;<br>
-        break;<br>
-      }<br>
-      CurMask++;<br>
+    int SkipUndef = 0;<br>
+    while (ShuffleMask[SkipUndef] == -1) {<br>
+      SkipUndef++;<br>
     }<br>
-    if (IsSequential) {<br>
-      assert((EltSize % 8 == 0) && "Bitsize of vector element is incorrect");<br>
-      unsigned VecSize = EltSize * V1EltNum;<br>
-      unsigned Index = (EltSize/8) * ShuffleMask[0];<br>
-      if (VecSize == 64 || VecSize == 128)<br>
-        return DAG.getNode(AArch64ISD::NEON_VEXTRACT, dl, VT, V1, V2,<br>
-                           DAG.getConstant(Index, MVT::i64));<br>
+    int CurMask = ShuffleMask[SkipUndef];<br>
+    if (CurMask >= SkipUndef) {<br>
+      bool IsSequential = true;<br>
+      for (int I = SkipUndef; I < Length; ++I) {<br>
+        if (ShuffleMask[I] != -1 && ShuffleMask[I] != CurMask) {<br>
+          IsSequential = false;<br>
+          break;<br>
+        }<br>
+        CurMask++;<br>
+      }<br>
+      if (IsSequential) {<br>
+        assert((EltSize % 8 == 0) && "Bitsize of vector element is incorrect");<br>
+        unsigned VecSize = EltSize * V1EltNum;<br>
+        unsigned Index = (EltSize / 8) * (ShuffleMask[SkipUndef] - SkipUndef);<br>
+        if (VecSize == 64 || VecSize == 128)<br>
+          return DAG.getNode(AArch64ISD::NEON_VEXTRACT, dl, VT, V1, V2,<br>
+                             DAG.getConstant(Index, MVT::i64));<br>
+      }<br>
     }<br>
   }<br>
<br>
<br>
Modified: llvm/trunk/test/CodeGen/AArch64/neon-extract.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/neon-extract.ll?rev=199628&r1=199627&r2=199628&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/neon-extract.ll?rev=199628&r1=199627&r2=199628&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/CodeGen/AArch64/neon-extract.ll (original)<br>
+++ llvm/trunk/test/CodeGen/AArch64/neon-extract.ll Mon Jan 20 01:32:26 2014<br>
@@ -188,3 +188,35 @@ entry:<br>
   %vext = shufflevector <8 x i16> %a, <8 x i16> %b, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
   ret <8 x i16> %vext<br>
 }<br>
+<br>
+define <8 x i8> @test_undef_vext_s8(<8 x i8> %a) {<br>
+; CHECK: test_undef_vext_s8:<br>
+; CHECK: ext {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0x2<br>
+entry:<br>
+  %vext = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 10, i32 10, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9><br>
+  ret <8 x i8> %vext<br>
+}<br>
+<br>
+define <16 x i8> @test_undef_vextq_s8(<16 x i8> %a) {<br>
+; CHECK: test_undef_vextq_s8:<br>
+; CHECK: ext {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0x6<br>
+entry:<br>
+  %vext = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 20, i32 20, i32 20, i32 20, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 20, i32 20, i32 20, i32 20, i32 20><br>

+  ret <16 x i8> %vext<br>
+}<br>
+<br>
+define <4 x i16> @test_undef_vext_s16(<4 x i16> %a) {<br>
+; CHECK: test_undef_vext_s16:<br>
+; CHECK: ext {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0x2<br>
+entry:<br>
+  %vext = shufflevector <4 x i16> %a, <4 x i16> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 4><br>
+  ret <4 x i16> %vext<br>
+}<br>
+<br>
+define <8 x i16> @test_undef_vextq_s16(<8 x i16> %a) {<br>
+; CHECK: test_undef_vextq_s16:<br>
+; CHECK: ext {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0x6<br>
+entry:<br>
+  %vext = shufflevector <8 x i16> %a, <8 x i16> undef, <8 x i32> <i32 10, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10><br>
+  ret <8 x i16> %vext<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" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>