<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Looks good to me!</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br>
</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">Thanks,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">-Jiangning</div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">2014/1/17 Kevin Qin <span dir="ltr"><<a href="mailto:kevinqindev@gmail.com" target="_blank">kevinqindev@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi #llvm,<br>
<br>
Hi,<br>
<br>
Previous code doesn't consider lane number would be -1, which means undef. And it would create a huge immediate (the complement of -1) for lane operand and cause pattern match fail. This patch can fix that problem. Please review.<br>

<br>
<a href="http://llvm-reviews.chandlerc.com/D2567" target="_blank">http://llvm-reviews.chandlerc.com/D2567</a><br>
<br>
Files:<br>
  lib/Target/AArch64/AArch64ISelLowering.cpp<br>
  test/CodeGen/AArch64/neon-extract.ll<br>
<br>
Index: lib/Target/AArch64/AArch64ISelLowering.cpp<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64ISelLowering.cpp<br>
+++ lib/Target/AArch64/AArch64ISelLowering.cpp<br>
@@ -4404,22 +4404,28 @@<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>
Index: test/CodeGen/AArch64/neon-extract.ll<br>
===================================================================<br>
--- test/CodeGen/AArch64/neon-extract.ll<br>
+++ test/CodeGen/AArch64/neon-extract.ll<br>
@@ -188,3 +188,35 @@<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>
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>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><font face="courier new, monospace">Thanks,</font><div><font face="courier new, monospace">-Jiangning</font></div></div>
</div>