add test to show suboptimal load merging behavior
[oota-llvm.git] / test / CodeGen / X86 / pmovext.ll
1 ; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
2
3 ; rdar://11897677
4
5 ;CHECK-LABEL: intrin_pmov:
6 ;CHECK: pmovzxbw  (%{{.*}}), %xmm0
7 ;CHECK-NEXT: movdqu
8 ;CHECK-NEXT: ret
9 define void @intrin_pmov(i16* noalias %dest, i8* noalias %src) nounwind uwtable ssp {
10   %1 = bitcast i8* %src to <2 x i64>*
11   %2 = load <2 x i64>, <2 x i64>* %1, align 16
12   %3 = bitcast <2 x i64> %2 to <16 x i8>
13   %4 = tail call <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8> %3) nounwind
14   %5 = bitcast i16* %dest to i8*
15   %6 = bitcast <8 x i16> %4 to <16 x i8>
16   tail call void @llvm.x86.sse2.storeu.dq(i8* %5, <16 x i8> %6) nounwind
17   ret void
18 }
19
20 declare <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8>) nounwind readnone
21 declare void @llvm.x86.sse2.storeu.dq(i8*, <16 x i8>) nounwind
22
23 ; rdar://15245794
24
25 define <4 x i32> @foo0(double %v.coerce) nounwind ssp {
26 ; CHECK-LABEL: foo0
27 ; CHECK: pmovzxwd %xmm0, %xmm0
28 ; CHECK-NEXT: ret
29   %tmp = bitcast double %v.coerce to <4 x i16>
30   %tmp1 = shufflevector <4 x i16> %tmp, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
31   %tmp2 = tail call <4 x i32> @llvm.x86.sse41.pmovzxwd(<8 x i16> %tmp1) nounwind
32   ret <4 x i32> %tmp2
33 }
34
35 define <8 x i16> @foo1(double %v.coerce) nounwind ssp {
36 ; CHECK-LABEL: foo1
37 ; CHECK: pmovzxbw %xmm0, %xmm0
38 ; CHECK-NEXT: ret
39   %tmp = bitcast double %v.coerce to <8 x i8>
40   %tmp1 = shufflevector <8 x i8> %tmp, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
41   %tmp2 = tail call <8 x i16> @llvm.x86.sse41.pmovzxbw(<16 x i8> %tmp1)
42   ret <8 x i16> %tmp2
43 }
44
45 declare <4 x i32> @llvm.x86.sse41.pmovzxwd(<8 x i16>) nounwind readnone