<div dir="ltr">Elena, this isn't an AVX-512 specific change, and isn't just code improvements.<br><br><div>This refactors logic to be common betwene AVX2 and AVX-512. While that may be the right call, it isn't clear what the end state looks like here, and the refactoring isn't an obvious benefit. The code for AVX2 was very simple, and the new code involves loops and other complexity. Perhaps we need it, but that isn't clear to me yet.</div><div><br></div><div>Notably, the most unclear thing to me about all of this is what the end state of the AVX-512 code looks like. I really would rather you send a precommit review for that for discussion rather than refactoring AVX2 code that we know to be working.</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jun 3, 2015 at 4:30 AM Elena Demikhovsky <<a href="mailto:elena.demikhovsky@intel.com">elena.demikhovsky@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: delena<br>
Date: Wed Jun  3 06:21:01 2015<br>
New Revision: 238918<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D238918-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=08g7alEp438d2cSxK7fnP7WzyD0lT-9rNFGb05xQmRc&s=mgi215PoGMn5zf7mTjF7TwCpdC9cjQNuMEUWyoLB-Kg&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=238918&view=rev</a><br>
Log:<br>
AVX-512: VSHUFPD instruction selection - code improvements<br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_Target_X86_X86ISelLowering.cpp-3Frev-3D238918-26r1-3D238917-26r2-3D238918-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=08g7alEp438d2cSxK7fnP7WzyD0lT-9rNFGb05xQmRc&s=Fv6x8qikkSerCcOkECG3VYgjYMJqbnn-g9Hf_xh953U&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=238918&r1=238917&r2=238918&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Jun  3 06:21:01 2015<br>
@@ -9468,6 +9468,37 @@ static bool isShuffleMaskInputInPlace(in<br>
   return true;<br>
 }<br>
<br>
+static SDValue lowerVectorShuffleWithSHUFPD(SDLoc DL, MVT VT,<br>
+                                            ArrayRef<int> Mask, SDValue V1,<br>
+                                            SDValue V2, SelectionDAG &DAG) {<br>
+<br>
+  // Mask for V8F64: 0/1,  8/9,  2/3,  10/11, 4/5, ..<br>
+  // Mask for V4F64; 0/1,  4/5,  2/3,  6/7..<br>
+  assert(VT.getScalarSizeInBits() == 64 && "Unexpected data type for VSHUFPD");<br>
+  int NumElts = VT.getVectorNumElements();<br>
+  bool ShufpdMask = true;<br>
+  bool CommutableMask = true;<br>
+  unsigned Immediate = 0;<br>
+  for (int i = 0; i < NumElts; ++i) {<br>
+    if (Mask[i] < 0)<br>
+      continue;<br>
+    int Val = (i & 6) + NumElts * (i & 1);<br>
+    int CommutVal = (i & 0xe) + NumElts * ((i & 1)^1);<br>
+    if (Mask[i] < Val ||  Mask[i] > Val + 1)<br>
+      ShufpdMask = false;<br>
+    if (Mask[i] < CommutVal ||  Mask[i] > CommutVal + 1)<br>
+      CommutableMask = false;<br>
+    Immediate |= (Mask[i] % 2) << i;<br>
+  }<br>
+  if (ShufpdMask)<br>
+    return DAG.getNode(X86ISD::SHUFP, DL, VT, V1, V2,<br>
+                       DAG.getConstant(Immediate, DL, MVT::i8));<br>
+  if (CommutableMask)<br>
+    return DAG.getNode(X86ISD::SHUFP, DL, VT, V2, V1,<br>
+                       DAG.getConstant(Immediate, DL, MVT::i8));<br>
+  return SDValue();<br>
+}<br>
+<br>
 /// \brief Handle lowering of 4-lane 64-bit floating point shuffles.<br>
 ///<br>
 /// Also ends up handling lowering of 4-lane 64-bit integer shuffles when AVX2<br>
@@ -9532,24 +9563,9 @@ static SDValue lowerV4F64VectorShuffle(S<br>
     return Blend;<br>
<br>
   // Check if the blend happens to exactly fit that of SHUFPD.<br>
-  if ((Mask[0] == -1 || Mask[0] < 2) &&<br>
-      (Mask[1] == -1 || (Mask[1] >= 4 && Mask[1] < 6)) &&<br>
-      (Mask[2] == -1 || (Mask[2] >= 2 && Mask[2] < 4)) &&<br>
-      (Mask[3] == -1 || Mask[3] >= 6)) {<br>
-    unsigned SHUFPDMask = (Mask[0] == 1) | ((Mask[1] == 5) << 1) |<br>
-                          ((Mask[2] == 3) << 2) | ((Mask[3] == 7) << 3);<br>
-    return DAG.getNode(X86ISD::SHUFP, DL, MVT::v4f64, V1, V2,<br>
-                       DAG.getConstant(SHUFPDMask, DL, MVT::i8));<br>
-  }<br>
-  if ((Mask[0] == -1 || (Mask[0] >= 4 && Mask[0] < 6)) &&<br>
-      (Mask[1] == -1 || Mask[1] < 2) &&<br>
-      (Mask[2] == -1 || Mask[2] >= 6) &&<br>
-      (Mask[3] == -1 || (Mask[3] >= 2 && Mask[3] < 4))) {<br>
-    unsigned SHUFPDMask = (Mask[0] == 5) | ((Mask[1] == 1) << 1) |<br>
-                          ((Mask[2] == 7) << 2) | ((Mask[3] == 3) << 3);<br>
-    return DAG.getNode(X86ISD::SHUFP, DL, MVT::v4f64, V2, V1,<br>
-                       DAG.getConstant(SHUFPDMask, DL, MVT::i8));<br>
-  }<br>
+  if (SDValue Op =<br>
+      lowerVectorShuffleWithSHUFPD(DL, MVT::v4f64, Mask, V1, V2, DAG))<br>
+    return Op;<br>
<br>
   // Try to simplify this by merging 128-bit lanes to enable a lane-based<br>
   // shuffle. However, if we have AVX2 and either inputs are already in place,<br>
@@ -10156,22 +10172,8 @@ static SDValue lowerV8X64VectorShuffle(S<br>
   if (SDValue Op = lowerVectorShuffleWithVALIGN(DL, VT, Mask, V1, V2, DAG))<br>
     return Op;<br>
<br>
-  // VSHUFPD instruction - mask 0/1, 8/9, 2/3, 10/11, 4/5, 12/13, 6/7, 14/15<br>
-  bool ShufpdMask = true;<br>
-  unsigned Immediate = 0;<br>
-  for (int i = 0; i < 8; ++i) {<br>
-    if (Mask[i] < 0)<br>
-      continue;<br>
-    int Val = (i & 6) + 8 * (i & 1);<br>
-    if (Mask[i] < Val ||  Mask[i] > Val+1) {<br>
-      ShufpdMask = false;<br>
-      break;<br>
-    }<br>
-    Immediate |= (Mask[i]%2) << i;<br>
-  }<br>
-  if (ShufpdMask)<br>
-    return DAG.getNode(X86ISD::SHUFP, DL, VT, V1, V2,<br>
-                       DAG.getConstant(Immediate, DL, MVT::i8));<br>
+  if (SDValue Op = lowerVectorShuffleWithSHUFPD(DL, VT, Mask, V1, V2, DAG))<br>
+    return Op;<br>
<br>
   // PERMILPD instruction - mask 0/1, 0/1, 2/3, 2/3, 4/5, 4/5, 6/7, 6/7<br>
   if (isSingleInputShuffleMask(Mask)) {<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_CodeGen_X86_avx512-2Dshuffle.ll-3Frev-3D238918-26r1-3D238917-26r2-3D238918-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=08g7alEp438d2cSxK7fnP7WzyD0lT-9rNFGb05xQmRc&s=plkAB1RAQNMRZRaiLnTWtGATqrgphx371THxmoezjzQ&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll?rev=238918&r1=238917&r2=238918&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/avx512-shuffle.ll Wed Jun  3 06:21:01 2015<br>
@@ -242,3 +242,11 @@ define <16 x i32> @test31(<16 x i32> %a,<br>
   %c = shufflevector <16 x i32> %a, <16 x i32> %b, <16 x i32> <i32 3, i32 4, i32 5, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18><br>
   ret <16 x i32> %c<br>
 }<br>
+<br>
+; CHECK-LABEL: test32<br>
+; CHECK: vshufpd $99, %zmm0, %zmm1<br>
+; CHECK: ret<br>
+define <8 x double> @test32(<8 x double> %a, <8 x double> %b) nounwind {<br>
+  %c = shufflevector <8 x double> %a, <8 x double> %b, <8 x i32> <i32 9, i32 1, i32 10, i32 2, i32 undef, i32 5, i32 15, i32 undef><br>
+  ret <8 x double> %c<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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>