Skip to content

Commit fea5c7a

Browse files
committed
[X86][AVX] Add test showing that VBROADCAST loads don't correctly respect dependencies
llvm-svn: 282613
1 parent b6ce6e5 commit fea5c7a

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

llvm/test/CodeGen/X86/avx-vbroadcast.ll

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,3 +546,62 @@ define <4 x double> @splat_concat4(double* %p) {
546546
%6 = shufflevector <2 x double> %3, <2 x double> %5, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
547547
ret <4 x double> %6
548548
}
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

Comments
 (0)