[llvm] r357465 - [X86][AVX] Add test case showing failure to fold broadcast load if its also used as a scalar

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 2 03:31:00 PDT 2019


Author: rksimon
Date: Tue Apr  2 03:31:00 2019
New Revision: 357465

URL: http://llvm.org/viewvc/llvm-project?rev=357465&view=rev
Log:
[X86][AVX] Add test case showing failure to fold broadcast load if its also used as a scalar

Modified:
    llvm/trunk/test/CodeGen/X86/avx-vbroadcast.ll

Modified: llvm/trunk/test/CodeGen/X86/avx-vbroadcast.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/avx-vbroadcast.ll?rev=357465&r1=357464&r2=357465&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/avx-vbroadcast.ll (original)
+++ llvm/trunk/test/CodeGen/X86/avx-vbroadcast.ll Tue Apr  2 03:31:00 2019
@@ -883,6 +883,54 @@ define void @broadcast_v16i32(i32* %a, <
 }
 
 ;
+; Broadcast scale factor for xyz vector - slp will have vectorized xy.
+; FIXME: Load as a broadcast and then use the scalar 0'th element.
+;
+define double @broadcast_scale_xyz(double* nocapture readonly, double* nocapture readonly) nounwind {
+; X32-LABEL: broadcast_scale_xyz:
+; X32:       ## %bb.0:
+; X32-NEXT:    subl $12, %esp
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
+; X32-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
+; X32-NEXT:    vmulpd (%eax), %xmm1, %xmm1
+; X32-NEXT:    vmulsd 16(%eax), %xmm0, %xmm0
+; X32-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
+; X32-NEXT:    vaddsd %xmm2, %xmm1, %xmm1
+; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
+; X32-NEXT:    vmovsd %xmm0, (%esp)
+; X32-NEXT:    fldl (%esp)
+; X32-NEXT:    addl $12, %esp
+; X32-NEXT:    retl
+;
+; X64-LABEL: broadcast_scale_xyz:
+; X64:       ## %bb.0:
+; X64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
+; X64-NEXT:    vmovddup {{.*#+}} xmm1 = xmm0[0,0]
+; X64-NEXT:    vmulpd (%rsi), %xmm1, %xmm1
+; X64-NEXT:    vmulsd 16(%rsi), %xmm0, %xmm0
+; X64-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm1[1,0]
+; X64-NEXT:    vaddsd %xmm2, %xmm1, %xmm1
+; X64-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
+; X64-NEXT:    retq
+  %3 = bitcast double* %1 to <2 x double>*
+  %4 = load <2 x double>, <2 x double>* %3, align 8
+  %5 = getelementptr inbounds double, double* %1, i64 2
+  %6 = load double, double* %5, align 8
+  %7 = load double, double* %0, align 8
+  %8 = insertelement <2 x double> undef, double %7, i32 0
+  %9 = shufflevector <2 x double> %8, <2 x double> undef, <2 x i32> zeroinitializer
+  %10 = fmul <2 x double> %4, %9
+  %11 = fmul double %6, %7
+  %12 = extractelement <2 x double> %10, i32 0
+  %13 = extractelement <2 x double> %10, i32 1
+  %14 = fadd double %12, %13
+  %15 = fadd double %11, %14
+  ret double %15
+}
+
+;
 ; When VBROADCAST replaces an existing load, ensure it still respects lifetime dependencies.
 ;
 define float @broadcast_lifetime() nounwind {




More information about the llvm-commits mailing list