[llvm] r327159 - [X86][AVX] createVariablePermute - fix v2i64/v2f64 VPERMILPD index creation.

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 9 10:37:56 PST 2018


Author: rksimon
Date: Fri Mar  9 10:37:56 2018
New Revision: 327159

URL: http://llvm.org/viewvc/llvm-project?rev=327159&view=rev
Log:
[X86][AVX] createVariablePermute - fix v2i64/v2f64 VPERMILPD index creation. 

The input indices vector will put the index in bit0, but VPERMILPD actually selects off bit1 - so we need to scale accordingly.

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
    llvm/trunk/test/CodeGen/X86/var-permute-128.ll

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=327159&r1=327158&r2=327159&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Fri Mar  9 10:37:56 2018
@@ -7963,6 +7963,8 @@ SDValue createVariablePermute(MVT VT, SD
   case MVT::v2f64:
   case MVT::v2i64:
     if (Subtarget.hasAVX()) {
+      // VPERMILPD selects using bit#1 of the index vector, so scale IndicesVec.
+      IndicesVec = DAG.getNode(ISD::ADD, DL, IndicesVT, IndicesVec, IndicesVec);
       Opcode = X86ISD::VPERMILPV;
       ShuffleVT = MVT::v2f64;
     }

Modified: llvm/trunk/test/CodeGen/X86/var-permute-128.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/var-permute-128.ll?rev=327159&r1=327158&r2=327159&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/var-permute-128.ll (original)
+++ llvm/trunk/test/CodeGen/X86/var-permute-128.ll Fri Mar  9 10:37:56 2018
@@ -37,6 +37,7 @@ define <2 x i64> @var_shuffle_v2i64(<2 x
 ;
 ; AVX-LABEL: var_shuffle_v2i64:
 ; AVX:       # %bb.0:
+; AVX-NEXT:    vpaddq %xmm1, %xmm1, %xmm1
 ; AVX-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    retq
   %index0 = extractelement <2 x i64> %indices, i32 0
@@ -221,6 +222,7 @@ define <2 x double> @var_shuffle_v2f64(<
 ;
 ; AVX-LABEL: var_shuffle_v2f64:
 ; AVX:       # %bb.0:
+; AVX-NEXT:    vpaddq %xmm1, %xmm1, %xmm1
 ; AVX-NEXT:    vpermilpd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    retq
   %index0 = extractelement <2 x i64> %indices, i32 0




More information about the llvm-commits mailing list