]> granicus.if.org Git - llvm/commitdiff
[X86] Cleanup patterns for using VMOVDDUP for broadcasts.
authorCraig Topper <craig.topper@gmail.com>
Sat, 1 Oct 2016 07:11:24 +0000 (07:11 +0000)
committerCraig Topper <craig.topper@gmail.com>
Sat, 1 Oct 2016 07:11:24 +0000 (07:11 +0000)
-Remove OptForSize. Not all of the backend follows the same rules for creating broadcasts and there is no conflicting pattern.
-Don't stop selecting VEX VMOVDDUP when AVX512 is supported. We need VLX for EVEX VMOVDDUP.
-Only use VMOVDDUP for v2i64 broadcasts if AVX2 is not supported.

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

lib/Target/X86/X86InstrSSE.td
test/CodeGen/X86/avx2-vbroadcast.ll
test/CodeGen/X86/splat-for-size.ll

index 98d5dac9e8e2184d313ddedf6bf73be60aac49b2..bad2d4ea415e19bd5cc9d663ad94ccd5aaa2262a 100644 (file)
@@ -5162,12 +5162,12 @@ let Predicates = [HasAVX] in {
             (VMOVDDUPrm addr:$src)>, Requires<[HasAVX]>;
 }
 
-let Predicates = [UseAVX, OptForSize] in {
-  def : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))),
-            (VMOVDDUPrm addr:$src)>;
-  def : Pat<(v2i64 (X86VBroadcast (loadi64 addr:$src))),
-            (VMOVDDUPrm addr:$src)>;
-}
+let Predicates = [HasAVX, NoVLX] in
+def : Pat<(v2f64 (X86VBroadcast (loadf64 addr:$src))),
+          (VMOVDDUPrm addr:$src)>;
+let Predicates = [HasAVX1Only] in
+def : Pat<(v2i64 (X86VBroadcast (loadi64 addr:$src))),
+          (VMOVDDUPrm addr:$src)>;
 
 let Predicates = [UseSSE3] in {
   def : Pat<(X86Movddup (memopv2f64 addr:$src)),
index 4e004d2583b47068280a538e95f1b4b072dd84e4..029c21ae046a99e5a59e09566a8b6f51c37d5618 100644 (file)
@@ -250,8 +250,7 @@ define <8 x i16> @broadcast_mem_v4i16_v8i16(<4 x i16>* %ptr) {
 ; X32-AVX2-LABEL: broadcast_mem_v4i16_v8i16:
 ; X32-AVX2:       ## BB#0:
 ; X32-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X32-AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
-; X32-AVX2-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
+; X32-AVX2-NEXT:    vmovddup {{.*#+}} xmm0 = mem[0,0]
 ; X32-AVX2-NEXT:    retl
 ;
 ; X64-AVX2-LABEL: broadcast_mem_v4i16_v8i16:
index 277472f49b3a7fa64efa8993e6c972f57510b0d0..0d1c1bcf76ba53578e36955c141851ac79850d74 100644 (file)
@@ -49,11 +49,17 @@ define <8 x float> @splat_v8f32(<8 x float> %x) #1 {
 ; AVX can't do integer splats, so fake it: use vmovddup to splat 64-bit value.
 ; We also generate vmovddup for AVX2 because it's one byte smaller than vpbroadcastq.
 define <2 x i64> @splat_v2i64(<2 x i64> %x) #1 {
-; CHECK-LABEL: splat_v2i64:
-; CHECK:       # BB#0:
-; CHECK-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]
-; CHECK-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
-; CHECK-NEXT:    retq
+; AVX-LABEL: splat_v2i64:
+; AVX:       # BB#0:
+; AVX-NEXT:    vmovddup {{.*#+}} xmm1 = mem[0,0]
+; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
+; AVX-NEXT:    retq
+;
+; AVX2-LABEL: splat_v2i64:
+; AVX2:       # BB#0:
+; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %xmm1
+; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    retq
   %add = add <2 x i64> %x, <i64 1, i64 1>
   ret <2 x i64> %add
 }