]> granicus.if.org Git - llvm/commitdiff
[X86] Add test cases for masked store and masked scatter with an all zeroes mask...
authorCraig Topper <craig.topper@intel.com>
Sun, 2 Jun 2019 22:52:34 +0000 (22:52 +0000)
committerCraig Topper <craig.topper@intel.com>
Sun, 2 Jun 2019 22:52:34 +0000 (22:52 +0000)
Need to cast only to Constant instead of ConstantVector to allow
ConstantAggregateZero.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@362341 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/ScalarizeMaskedMemIntrin.cpp
test/CodeGen/X86/masked_gather_scatter.ll
test/CodeGen/X86/masked_store.ll

index e2ee9f28f3b5592491b1b2c459304803cb12eede..7776dffb4e9c8ff7fa68fd1c1412c40c16207e2d 100644 (file)
@@ -488,7 +488,7 @@ static void scalarizeMaskedScatter(CallInst *CI, bool &ModifiedDT) {
   // Shorten the way if the mask is a vector of constants.
   if (isConstantIntVector(Mask)) {
     for (unsigned Idx = 0; Idx < VectorWidth; ++Idx) {
-      if (cast<ConstantVector>(Mask)->getAggregateElement(Idx)->isNullValue())
+      if (cast<Constant>(Mask)->getAggregateElement(Idx)->isNullValue())
         continue;
       Value *OneElt =
           Builder.CreateExtractElement(Src, Idx, "Elt" + Twine(Idx));
index 8ee23d6feff13e2773e6fc2cf816d56e7e4ff4fb..2d6b19b334e0243901c0a5a7352e3c44939b156a 100644 (file)
@@ -2964,3 +2964,40 @@ define <16 x float> @test_sext_cse(float* %base, <16 x i32> %ind, <16 x i32>* %f
   %res3 = fadd <16 x float> %res2, %res
   ret <16 x float>%res3
 }
+
+define void @zero_mask(<2 x double>%a1, <2 x double*> %ptr) {
+; KNL_64-LABEL: zero_mask:
+; KNL_64:       # %bb.0:
+; KNL_64-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
+; KNL_64-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
+; KNL_64-NEXT:    kxorw %k0, %k0, %k1
+; KNL_64-NEXT:    vscatterqpd %zmm0, (,%zmm1) {%k1}
+; KNL_64-NEXT:    vzeroupper
+; KNL_64-NEXT:    retq
+;
+; KNL_32-LABEL: zero_mask:
+; KNL_32:       # %bb.0:
+; KNL_32-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
+; KNL_32-NEXT:    vpsllq $32, %xmm1, %xmm1
+; KNL_32-NEXT:    vpsraq $32, %zmm1, %zmm1
+; KNL_32-NEXT:    kxorw %k0, %k0, %k1
+; KNL_32-NEXT:    vscatterqpd %zmm0, (,%zmm1) {%k1}
+; KNL_32-NEXT:    vzeroupper
+; KNL_32-NEXT:    retl
+;
+; SKX-LABEL: zero_mask:
+; SKX:       # %bb.0:
+; SKX-NEXT:    kxorw %k0, %k0, %k1
+; SKX-NEXT:    vscatterqpd %xmm0, (,%xmm1) {%k1}
+; SKX-NEXT:    retq
+;
+; SKX_32-LABEL: zero_mask:
+; SKX_32:       # %bb.0:
+; SKX_32-NEXT:    vpsllq $32, %xmm1, %xmm1
+; SKX_32-NEXT:    vpsraq $32, %xmm1, %xmm1
+; SKX_32-NEXT:    kxorw %k0, %k0, %k1
+; SKX_32-NEXT:    vscatterqpd %xmm0, (,%xmm1) {%k1}
+; SKX_32-NEXT:    retl
+  call void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double> %a1, <2 x double*> %ptr, i32 4, <2 x i1> zeroinitializer)
+  ret void
+}
index efbb1ef8cc667cae1fbf5f227da3b1203ed3b650..180197ccbcfbe411c24d1c660509dcb03bdace53 100644 (file)
@@ -5505,6 +5505,34 @@ define void @widen_masked_store(<3 x i32> %v, <3 x i32>* %p, <3 x i1> %mask) {
   ret void
 }
 
+define void @zero_mask(<2 x double>* %addr, <2 x double> %val) {
+; SSE-LABEL: zero_mask:
+; SSE:       ## %bb.0:
+; SSE-NEXT:    retq
+;
+; AVX1OR2-LABEL: zero_mask:
+; AVX1OR2:       ## %bb.0:
+; AVX1OR2-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
+; AVX1OR2-NEXT:    vmaskmovpd %xmm0, %xmm1, (%rdi)
+; AVX1OR2-NEXT:    retq
+;
+; AVX512F-LABEL: zero_mask:
+; AVX512F:       ## %bb.0:
+; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
+; AVX512F-NEXT:    kxorw %k0, %k0, %k1
+; AVX512F-NEXT:    vmovupd %zmm0, (%rdi) {%k1}
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    retq
+;
+; AVX512VL-LABEL: zero_mask:
+; AVX512VL:       ## %bb.0:
+; AVX512VL-NEXT:    kxorw %k0, %k0, %k1
+; AVX512VL-NEXT:    vmovupd %xmm0, (%rdi) {%k1}
+; AVX512VL-NEXT:    retq
+  call void @llvm.masked.store.v2f64.p0v2f64(<2 x double> %val, <2 x double>* %addr, i32 4, <2 x i1> zeroinitializer)
+  ret void
+}
+
 declare void @llvm.masked.store.v8f64.p0v8f64(<8 x double>, <8 x double>*, i32, <8 x i1>)
 declare void @llvm.masked.store.v4f64.p0v4f64(<4 x double>, <4 x double>*, i32, <4 x i1>)
 declare void @llvm.masked.store.v2f64.p0v2f64(<2 x double>, <2 x double>*, i32, <2 x i1>)