@@ -546,3 +546,62 @@ define <4 x double> @splat_concat4(double* %p) {
546
546
%6 = shufflevector <2 x double > %3 , <2 x double > %5 , <4 x i32 > <i32 0 , i32 1 , i32 2 , i32 3 >
547
547
ret <4 x double > %6
548
548
}
549
+
550
+ ;
551
+ ; FIXME: When VBROADCAST replaces an existing load, ensure it still respects lifetime dependencies.
552
+ ;
553
+ define float @broadcast_lifetime () nounwind {
554
+ ; X32-LABEL: broadcast_lifetime:
555
+ ; X32: ## BB#0:
556
+ ; X32-NEXT: pushl %esi
557
+ ; X32-NEXT: subl $40, %esp
558
+ ; X32-NEXT: leal {{[0-9]+}}(%esp), %esi
559
+ ; X32-NEXT: movl %esi, (%esp)
560
+ ; X32-NEXT: calll _gfunc
561
+ ; X32-NEXT: movl %esi, (%esp)
562
+ ; X32-NEXT: calll _gfunc
563
+ ; X32-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm0
564
+ ; X32-NEXT: vbroadcastss {{[0-9]+}}(%esp), %xmm1
565
+ ; X32-NEXT: vsubss %xmm0, %xmm1, %xmm0
566
+ ; X32-NEXT: vmovss %xmm0, {{[0-9]+}}(%esp)
567
+ ; X32-NEXT: flds {{[0-9]+}}(%esp)
568
+ ; X32-NEXT: addl $40, %esp
569
+ ; X32-NEXT: popl %esi
570
+ ; X32-NEXT: retl
571
+ ;
572
+ ; X64-LABEL: broadcast_lifetime:
573
+ ; X64: ## BB#0:
574
+ ; X64-NEXT: subq $24, %rsp
575
+ ; X64-NEXT: movq %rsp, %rdi
576
+ ; X64-NEXT: callq _gfunc
577
+ ; X64-NEXT: movq %rsp, %rdi
578
+ ; X64-NEXT: callq _gfunc
579
+ ; X64-NEXT: vbroadcastss {{[0-9]+}}(%rsp), %xmm0
580
+ ; X64-NEXT: vbroadcastss {{[0-9]+}}(%rsp), %xmm1
581
+ ; X64-NEXT: vsubss %xmm0, %xmm1, %xmm0
582
+ ; X64-NEXT: addq $24, %rsp
583
+ ; X64-NEXT: retq
584
+ %1 = alloca <4 x float >, align 16
585
+ %2 = alloca <4 x float >, align 16
586
+ %3 = bitcast <4 x float >* %1 to i8*
587
+ %4 = bitcast <4 x float >* %2 to i8*
588
+
589
+ call void @llvm.lifetime.start (i64 16 , i8* %3 )
590
+ call void @gfunc (<4 x float >* %1 )
591
+ %5 = load <4 x float >, <4 x float >* %1 , align 16
592
+ call void @llvm.lifetime.end (i64 16 , i8* %3 )
593
+
594
+ call void @llvm.lifetime.start (i64 16 , i8* %4 )
595
+ call void @gfunc (<4 x float >* %2 )
596
+ %6 = load <4 x float >, <4 x float >* %2 , align 16
597
+ call void @llvm.lifetime.end (i64 16 , i8* %4 )
598
+
599
+ %7 = extractelement <4 x float > %5 , i32 1
600
+ %8 = extractelement <4 x float > %6 , i32 1
601
+ %9 = fsub float %8 , %7
602
+ ret float %9
603
+ }
604
+
605
+ declare void @gfunc (<4 x float >*)
606
+ declare void @llvm.lifetime.start (i64 , i8* )
607
+ declare void @llvm.lifetime.end (i64 , i8* )
0 commit comments