[llvm] 2258b36 - [X86][AVX] getFauxShuffleMask - decode VBROADCAST(EXTRACT_VECTOR_ELT(V,0))

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 19 03:07:13 PST 2021


Author: Simon Pilgrim
Date: 2021-02-19T11:06:53Z
New Revision: 2258b367dbe9286b31ef88f5361d108c62216d00

URL: https://github.com/llvm/llvm-project/commit/2258b367dbe9286b31ef88f5361d108c62216d00
DIFF: https://github.com/llvm/llvm-project/commit/2258b367dbe9286b31ef88f5361d108c62216d00.diff

LOG: [X86][AVX] getFauxShuffleMask - decode VBROADCAST(EXTRACT_VECTOR_ELT(V,0))

Handle the case where we're broadcasting a scalar extracted from another vector.

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86ISelLowering.cpp
    llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index e5f454a251dd..008fbc179f5d 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -7821,8 +7821,14 @@ static bool getFauxShuffleMask(SDValue N, const APInt &DemandedElts,
   }
   case X86ISD::VBROADCAST: {
     SDValue Src = N.getOperand(0);
-    if (!Src.getSimpleValueType().isVector())
-      return false;
+    if (!Src.getSimpleValueType().isVector()) {
+      if (Src.getOpcode() != ISD::EXTRACT_VECTOR_ELT ||
+          !isNullConstant(Src.getOperand(1)) ||
+          Src.getOperand(0).getValueType().getScalarType() !=
+              VT.getScalarType())
+        return false;
+      Src = Src.getOperand(0);
+    }
     Ops.push_back(Src);
     Mask.append(NumElts, 0);
     return true;

diff  --git a/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll b/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll
index 7bd466b21daf..da169b6dff3c 100644
--- a/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll
+++ b/llvm/test/CodeGen/X86/vector-shuffle-combining-avx2.ll
@@ -782,9 +782,8 @@ define i32 @broadcast_v2i64_multiuse(i64* %p0) {
 ; X86-LABEL: broadcast_v2i64_multiuse:
 ; X86:       # %bb.0: # %entry
 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
-; X86-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
-; X86-NEXT:    vextractps $2, %xmm0, %eax
+; X86-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
+; X86-NEXT:    vmovd %xmm0, %eax
 ; X86-NEXT:    addl (%ecx), %eax
 ; X86-NEXT:    retl
 ;


        


More information about the llvm-commits mailing list