[X86][AVX512] Add PR52500 vXi1 broadcast test case
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 21 Mar 2022 16:46:48 +0000 (16:46 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 21 Mar 2022 17:25:29 +0000 (17:25 +0000)
llvm/test/CodeGen/X86/vector-shuffle-v1.ll

index 3eadf88..9af454b 100644 (file)
@@ -908,3 +908,64 @@ define i64 @shuf64i1_zero(i64 %a) {
   %d = bitcast <64 x i1> %c to i64
   ret i64 %d
 }
+
+define <16 x i1> @PR52500(<16 x i1> %msk, i32 %in) {
+; AVX512F-LABEL: PR52500:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
+; AVX512F-NEXT:    vpslld $31, %zmm0, %zmm0
+; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1
+; AVX512F-NEXT:    vmovd %edi, %xmm0
+; AVX512F-NEXT:    movl $789, %eax # imm = 0x315
+; AVX512F-NEXT:    vmovd %eax, %xmm1
+; AVX512F-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
+; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k2
+; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
+; AVX512F-NEXT:    vpbroadcastd %xmm0, %zmm0
+; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k1 {%k1}
+; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    retq
+;
+; AVX512VL-LABEL: PR52500:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpmovsxbd %xmm0, %zmm0
+; AVX512VL-NEXT:    vpslld $31, %zmm0, %zmm0
+; AVX512VL-NEXT:    vptestmd %zmm0, %zmm0, %k1
+; AVX512VL-NEXT:    vmovd %edi, %xmm0
+; AVX512VL-NEXT:    movl $789, %eax # imm = 0x315
+; AVX512VL-NEXT:    vmovd %eax, %xmm1
+; AVX512VL-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vptestnmd %zmm0, %zmm0, %k2
+; AVX512VL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
+; AVX512VL-NEXT:    vpbroadcastd %xmm0, %zmm0
+; AVX512VL-NEXT:    vptestmd %zmm0, %zmm0, %k1 {%k1}
+; AVX512VL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
+; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
+; AVX512VL-NEXT:    vzeroupper
+; AVX512VL-NEXT:    retq
+;
+; VL_BW_DQ-LABEL: PR52500:
+; VL_BW_DQ:       # %bb.0:
+; VL_BW_DQ-NEXT:    vpsllw $7, %xmm0, %xmm0
+; VL_BW_DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; VL_BW_DQ-NEXT:    vmovd %edi, %xmm2
+; VL_BW_DQ-NEXT:    movl $789, %eax # imm = 0x315
+; VL_BW_DQ-NEXT:    vmovd %eax, %xmm3
+; VL_BW_DQ-NEXT:    vpmulld %xmm3, %xmm2, %xmm2
+; VL_BW_DQ-NEXT:    vptestnmd %zmm2, %zmm2, %k0
+; VL_BW_DQ-NEXT:    vpmovm2d %k0, %zmm2
+; VL_BW_DQ-NEXT:    vpbroadcastd %xmm2, %zmm2
+; VL_BW_DQ-NEXT:    vpmovd2m %zmm2, %k1
+; VL_BW_DQ-NEXT:    vpcmpgtb %xmm0, %xmm1, %k0 {%k1}
+; VL_BW_DQ-NEXT:    vpmovm2b %k0, %xmm0
+; VL_BW_DQ-NEXT:    vzeroupper
+; VL_BW_DQ-NEXT:    retq
+  %insrt = insertelement <16 x i32> undef, i32 %in, i32 0
+  %mul = mul <16 x i32> %insrt, <i32 789, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
+  %eq = icmp eq <16 x i32> %mul, zeroinitializer
+  %cmp1 = shufflevector <16 x i1> %eq, <16 x i1> poison, <16 x i32> zeroinitializer
+  %and = and <16 x i1> %cmp1, %msk
+  ret <16 x i1> %and
+}