[X86][AVX] SimplifyDemandedVectorEltsForTargetShuffle - ensure mask is same size...
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 8 Jul 2020 10:47:43 +0000 (11:47 +0100)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Wed, 8 Jul 2020 10:47:59 +0000 (11:47 +0100)
Fixes test regression reported on D81791

llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/vector-shuffle-avx512.ll

index 5238014..2e7d306 100644 (file)
@@ -36935,11 +36935,16 @@ bool X86TargetLowering::SimplifyDemandedVectorEltsForTargetShuffle(
     return false;
 
   const Constant *C = getTargetConstantFromNode(Load);
-  if (!C || !C->getType()->isVectorTy())
+  if (!C)
+    return false;
+
+  Type *CTy = C->getType();
+  if (!CTy->isVectorTy() ||
+      CTy->getPrimitiveSizeInBits() != Mask.getValueSizeInBits())
     return false;
 
   // Handle scaling for i64 elements on 32-bit targets.
-  unsigned NumCstElts = cast<FixedVectorType>(C->getType())->getNumElements();
+  unsigned NumCstElts = cast<FixedVectorType>(CTy)->getNumElements();
   if (NumCstElts != NumElts && NumCstElts != (NumElts * 2))
     return false;
   unsigned Scale = NumCstElts / NumElts;
index b79746b..1ab6f2c 100644 (file)
@@ -528,8 +528,9 @@ define void @test_demandedelts_pshufb_v32i8_v16i8(<2 x i32>* %src, <8 x i32>* %d
 ; SKX64-NEXT:    vmovdqa 32(%rdi), %xmm0
 ; SKX64-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[12,13,14,15,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
 ; SKX64-NEXT:    vmovdqa %ymm0, 672(%rsi)
-; SKX64-NEXT:    vpermilps {{.*#+}} xmm0 = mem[1,0,2,3]
-; SKX64-NEXT:    vmovaps %ymm0, 832(%rsi)
+; SKX64-NEXT:    vmovdqa 208(%rdi), %xmm0
+; SKX64-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero
+; SKX64-NEXT:    vmovdqa %ymm0, 832(%rsi)
 ; SKX64-NEXT:    vzeroupper
 ; SKX64-NEXT:    retq
 ;
@@ -550,8 +551,9 @@ define void @test_demandedelts_pshufb_v32i8_v16i8(<2 x i32>* %src, <8 x i32>* %d
 ; SKX32-NEXT:    vmovdqa 32(%ecx), %xmm0
 ; SKX32-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[12,13,14,15,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero
 ; SKX32-NEXT:    vmovdqa %ymm0, 672(%eax)
-; SKX32-NEXT:    vpermilps {{.*#+}} xmm0 = mem[1,0,2,3]
-; SKX32-NEXT:    vmovaps %ymm0, 832(%eax)
+; SKX32-NEXT:    vmovdqa 208(%ecx), %xmm0
+; SKX32-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,6,7,0,1,2,3],zero,zero,zero,zero,zero,zero,zero,zero
+; SKX32-NEXT:    vmovdqa %ymm0, 832(%eax)
 ; SKX32-NEXT:    vzeroupper
 ; SKX32-NEXT:    retl
 ;