brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.2 KiB · 15b43c4 Raw
702 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,X644 5define <2 x i64> @freeze_insert_vector_elt(<2 x i64> %a0) {6; CHECK-LABEL: freeze_insert_vector_elt:7; CHECK:       # %bb.0:8; CHECK-NEXT:    vxorps %xmm0, %xmm0, %xmm09; CHECK-NEXT:    ret{{[l|q]}}10  %idx0 = insertelement <2 x i64> %a0, i64 0, i64 011  %freeze0 = freeze <2 x i64> %idx012  %idx1 = insertelement <2 x i64> %freeze0, i64 0, i64 113  %freeze1 = freeze <2 x i64> %idx114  ret <2 x i64> %freeze115}16 17define <4 x i32> @freeze_insert_subvector(<8 x i32> %a0) nounwind {18; CHECK-LABEL: freeze_insert_subvector:19; CHECK:       # %bb.0:20; CHECK-NEXT:    vxorps %xmm0, %xmm0, %xmm021; CHECK-NEXT:    ret{{[l|q]}}22  %x = shufflevector <8 x i32> %a0, <8 x i32> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>23  %y = freeze <8 x i32> %x24  %z = shufflevector <8 x i32> %y, <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>25  ret <4 x i32> %z26}27 28define <2 x i64> @freeze_sign_extend_vector_inreg(<16 x i8> %a0) nounwind {29; CHECK-LABEL: freeze_sign_extend_vector_inreg:30; CHECK:       # %bb.0:31; CHECK-NEXT:    vpmovsxbq %xmm0, %xmm032; CHECK-NEXT:    ret{{[l|q]}}33  %x = sext <16 x i8> %a0 to <16 x i32>34  %y = shufflevector <16 x i32> %x, <16 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>35  %z = freeze <4 x i32> %y36  %w = sext <4 x i32> %z to <4 x i64>37  %r = shufflevector <4 x i64> %w, <4 x i64> poison, <2 x i32> <i32 0, i32 1>38  ret <2 x i64> %r39}40 41define <2 x i64> @freeze_zero_extend_vector_inreg(<16 x i8> %a0) nounwind {42; CHECK-LABEL: freeze_zero_extend_vector_inreg:43; CHECK:       # %bb.0:44; CHECK-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero45; CHECK-NEXT:    ret{{[l|q]}}46  %x = zext <16 x i8> %a0 to <16 x i32>47  %y = shufflevector <16 x i32> %x, <16 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>48  %z = freeze <4 x i32> %y49  %w = zext <4 x i32> %z to <4 x i64>50  %r = shufflevector <4 x i64> %w, <4 x i64> poison, <2 x i32> <i32 0, i32 1>51  ret <2 x i64> %r52}53 54define <4 x i32> @freeze_pshufd(<4 x i32> %a0) nounwind {55; CHECK-LABEL: freeze_pshufd:56; CHECK:       # %bb.0:57; CHECK-NEXT:    ret{{[l|q]}}58  %x = shufflevector <4 x i32> %a0, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>59  %y = freeze <4 x i32> %x60  %z = shufflevector <4 x i32> %y, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>61  ret <4 x i32> %z62}63 64define <4 x float> @freeze_permilps(<4 x float> %a0) nounwind {65; CHECK-LABEL: freeze_permilps:66; CHECK:       # %bb.0:67; CHECK-NEXT:    ret{{[l|q]}}68  %x = shufflevector <4 x float> %a0, <4 x float> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>69  %y = freeze <4 x float> %x70  %z = shufflevector <4 x float> %y, <4 x float> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>71  ret <4 x float> %z72}73 74define void @freeze_bitcast_from_wider_elt(ptr %origin, ptr %dst) nounwind {75; X86-LABEL: freeze_bitcast_from_wider_elt:76; X86:       # %bb.0:77; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax78; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx79; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero80; X86-NEXT:    vmovsd %xmm0, (%eax)81; X86-NEXT:    retl82;83; X64-LABEL: freeze_bitcast_from_wider_elt:84; X64:       # %bb.0:85; X64-NEXT:    movq (%rdi), %rax86; X64-NEXT:    movq %rax, (%rsi)87; X64-NEXT:    retq88  %i0 = load <4 x i16>, ptr %origin89  %i1 = bitcast <4 x i16> %i0 to <8 x i8>90  %i2 = freeze <8 x i8> %i191  %i3 = bitcast <8 x i8> %i2 to i6492  store i64 %i3, ptr %dst93  ret void94}95define void @freeze_bitcast_from_wider_elt_escape(ptr %origin, ptr %escape, ptr %dst) nounwind {96; X86-LABEL: freeze_bitcast_from_wider_elt_escape:97; X86:       # %bb.0:98; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax99; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx100; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx101; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero102; X86-NEXT:    vmovsd %xmm0, (%ecx)103; X86-NEXT:    vmovsd %xmm0, (%eax)104; X86-NEXT:    retl105;106; X64-LABEL: freeze_bitcast_from_wider_elt_escape:107; X64:       # %bb.0:108; X64-NEXT:    movq (%rdi), %rax109; X64-NEXT:    movq %rax, (%rsi)110; X64-NEXT:    movq %rax, (%rdx)111; X64-NEXT:    retq112  %i0 = load <4 x i16>, ptr %origin113  %i1 = bitcast <4 x i16> %i0 to <8 x i8>114  store <8 x i8> %i1, ptr %escape115  %i2 = freeze <8 x i8> %i1116  %i3 = bitcast <8 x i8> %i2 to i64117  store i64 %i3, ptr %dst118  ret void119}120 121define void @freeze_bitcast_to_wider_elt(ptr %origin, ptr %dst) nounwind {122; X86-LABEL: freeze_bitcast_to_wider_elt:123; X86:       # %bb.0:124; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax125; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx126; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero127; X86-NEXT:    vmovsd %xmm0, (%eax)128; X86-NEXT:    retl129;130; X64-LABEL: freeze_bitcast_to_wider_elt:131; X64:       # %bb.0:132; X64-NEXT:    movq (%rdi), %rax133; X64-NEXT:    movq %rax, (%rsi)134; X64-NEXT:    retq135  %i0 = load <8 x i8>, ptr %origin136  %i1 = bitcast <8 x i8> %i0 to <4 x i16>137  %i2 = freeze <4 x i16> %i1138  %i3 = bitcast <4 x i16> %i2 to i64139  store i64 %i3, ptr %dst140  ret void141}142define void @freeze_bitcast_to_wider_elt_escape(ptr %origin, ptr %escape, ptr %dst) nounwind {143; X86-LABEL: freeze_bitcast_to_wider_elt_escape:144; X86:       # %bb.0:145; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax146; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx147; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx148; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero149; X86-NEXT:    vmovsd %xmm0, (%ecx)150; X86-NEXT:    vmovsd %xmm0, (%eax)151; X86-NEXT:    retl152;153; X64-LABEL: freeze_bitcast_to_wider_elt_escape:154; X64:       # %bb.0:155; X64-NEXT:    movq (%rdi), %rax156; X64-NEXT:    movq %rax, (%rsi)157; X64-NEXT:    movq %rax, (%rdx)158; X64-NEXT:    retq159  %i0 = load <8 x i8>, ptr %origin160  %i1 = bitcast <8 x i8> %i0 to <4 x i16>161  store <4 x i16> %i1, ptr %escape162  %i2 = freeze <4 x i16> %i1163  %i3 = bitcast <4 x i16> %i2 to i64164  store i64 %i3, ptr %dst165  ret void166}167 168define void @freeze_extractelement(ptr %origin0, ptr %origin1, ptr %dst) nounwind {169; X86-LABEL: freeze_extractelement:170; X86:       # %bb.0:171; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax172; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx173; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx174; X86-NEXT:    vmovdqa (%edx), %xmm0175; X86-NEXT:    vpand (%ecx), %xmm0, %xmm0176; X86-NEXT:    vpextrb $6, %xmm0, (%eax)177; X86-NEXT:    retl178;179; X64-LABEL: freeze_extractelement:180; X64:       # %bb.0:181; X64-NEXT:    vmovdqa (%rdi), %xmm0182; X64-NEXT:    vpand (%rsi), %xmm0, %xmm0183; X64-NEXT:    vpextrb $6, %xmm0, (%rdx)184; X64-NEXT:    retq185  %i0 = load <16 x i8>, ptr %origin0186  %i1 = load <16 x i8>, ptr %origin1187  %i2 = and <16 x i8> %i0, %i1188  %i3 = freeze <16 x i8> %i2189  %i4 = extractelement <16 x i8> %i3, i64 6190  store i8 %i4, ptr %dst191  ret void192}193define void @freeze_extractelement_escape(ptr %origin0, ptr %origin1, ptr %dst, ptr %escape) nounwind {194; X86-LABEL: freeze_extractelement_escape:195; X86:       # %bb.0:196; X86-NEXT:    pushl %esi197; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax198; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx199; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx200; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi201; X86-NEXT:    vmovdqa (%esi), %xmm0202; X86-NEXT:    vpand (%edx), %xmm0, %xmm0203; X86-NEXT:    vmovdqa %xmm0, (%ecx)204; X86-NEXT:    vpextrb $6, %xmm0, (%eax)205; X86-NEXT:    popl %esi206; X86-NEXT:    retl207;208; X64-LABEL: freeze_extractelement_escape:209; X64:       # %bb.0:210; X64-NEXT:    vmovdqa (%rdi), %xmm0211; X64-NEXT:    vpand (%rsi), %xmm0, %xmm0212; X64-NEXT:    vmovdqa %xmm0, (%rcx)213; X64-NEXT:    vpextrb $6, %xmm0, (%rdx)214; X64-NEXT:    retq215  %i0 = load <16 x i8>, ptr %origin0216  %i1 = load <16 x i8>, ptr %origin1217  %i2 = and <16 x i8> %i0, %i1218  %i3 = freeze <16 x i8> %i2219  store <16 x i8> %i3, ptr %escape220  %i4 = extractelement <16 x i8> %i3, i64 6221  store i8 %i4, ptr %dst222  ret void223}224 225; It would be a miscompilation to pull freeze out of extractelement here.226define void @freeze_extractelement_extra_use(ptr %origin0, ptr %origin1, i64 %idx0, i64 %idx1, ptr %dst, ptr %escape) nounwind {227; X86-LABEL: freeze_extractelement_extra_use:228; X86:       # %bb.0:229; X86-NEXT:    pushl %ebp230; X86-NEXT:    movl %esp, %ebp231; X86-NEXT:    pushl %edi232; X86-NEXT:    pushl %esi233; X86-NEXT:    andl $-16, %esp234; X86-NEXT:    subl $16, %esp235; X86-NEXT:    movl 24(%ebp), %eax236; X86-NEXT:    andl $15, %eax237; X86-NEXT:    movl 16(%ebp), %ecx238; X86-NEXT:    andl $15, %ecx239; X86-NEXT:    movl 32(%ebp), %edx240; X86-NEXT:    movl 12(%ebp), %esi241; X86-NEXT:    movl 8(%ebp), %edi242; X86-NEXT:    vmovaps (%edi), %xmm0243; X86-NEXT:    vandps (%esi), %xmm0, %xmm0244; X86-NEXT:    vmovaps %xmm0, (%esp)245; X86-NEXT:    movzbl (%esp,%ecx), %ecx246; X86-NEXT:    cmpb (%esp,%eax), %cl247; X86-NEXT:    sete (%edx)248; X86-NEXT:    leal -8(%ebp), %esp249; X86-NEXT:    popl %esi250; X86-NEXT:    popl %edi251; X86-NEXT:    popl %ebp252; X86-NEXT:    retl253;254; X64-LABEL: freeze_extractelement_extra_use:255; X64:       # %bb.0:256; X64-NEXT:    andl $15, %ecx257; X64-NEXT:    andl $15, %edx258; X64-NEXT:    vmovaps (%rdi), %xmm0259; X64-NEXT:    vandps (%rsi), %xmm0, %xmm0260; X64-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)261; X64-NEXT:    movzbl -24(%rsp,%rdx), %eax262; X64-NEXT:    cmpb -24(%rsp,%rcx), %al263; X64-NEXT:    sete (%r8)264; X64-NEXT:    retq265  %i0 = load <16 x i8>, ptr %origin0266  %i1 = load <16 x i8>, ptr %origin1267  %i2 = and <16 x i8> %i0, %i1268  %i3 = freeze <16 x i8> %i2269  %i4 = extractelement <16 x i8> %i3, i64 %idx0270  %i5 = extractelement <16 x i8> %i3, i64 %idx1271  %i6 = icmp eq i8 %i4, %i5272  store i1 %i6, ptr %dst273  ret void274}275 276define void @freeze_buildvector_single_maybe_poison_operand(ptr %origin, ptr %dst) nounwind {277; X86-LABEL: freeze_buildvector_single_maybe_poison_operand:278; X86:       # %bb.0:279; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax280; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx281; X86-NEXT:    vbroadcastss {{.*#+}} xmm0 = [42,42,42,42]282; X86-NEXT:    vpinsrd $0, (%ecx), %xmm0, %xmm0283; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0284; X86-NEXT:    vmovdqa %xmm0, (%eax)285; X86-NEXT:    retl286;287; X64-LABEL: freeze_buildvector_single_maybe_poison_operand:288; X64:       # %bb.0:289; X64-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [42,42,42,42]290; X64-NEXT:    vpinsrd $0, (%rdi), %xmm0, %xmm0291; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]292; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0293; X64-NEXT:    vmovdqa %xmm0, (%rsi)294; X64-NEXT:    retq295  %i0.src = load i32, ptr %origin296  %i0 = and i32 %i0.src, 15297  %i1 = insertelement <4 x i32> poison, i32 %i0, i64 0298  %i2 = insertelement <4 x i32> %i1, i32 42, i64 1299  %i3 = insertelement <4 x i32> %i2, i32 42, i64 2300  %i4 = insertelement <4 x i32> %i3, i32 42, i64 3301  %i5 = freeze <4 x i32> %i4302  %i6 = and <4 x i32> %i5, <i32 7, i32 7, i32 7, i32 7>303  store <4 x i32> %i6, ptr %dst304  ret void305}306 307define void @freeze_buildvector_single_repeated_maybe_poison_operand(ptr %origin, ptr %dst) nounwind {308; X86-LABEL: freeze_buildvector_single_repeated_maybe_poison_operand:309; X86:       # %bb.0:310; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax311; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx312; X86-NEXT:    movl (%ecx), %ecx313; X86-NEXT:    andl $15, %ecx314; X86-NEXT:    vbroadcastss {{.*#+}} xmm0 = [42,42,42,42]315; X86-NEXT:    vpinsrd $0, %ecx, %xmm0, %xmm0316; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]317; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0318; X86-NEXT:    vmovdqa %xmm0, (%eax)319; X86-NEXT:    retl320;321; X64-LABEL: freeze_buildvector_single_repeated_maybe_poison_operand:322; X64:       # %bb.0:323; X64-NEXT:    vpbroadcastd {{.*#+}} xmm0 = [42,42,42,42]324; X64-NEXT:    vpinsrd $0, (%rdi), %xmm0, %xmm0325; X64-NEXT:    vpbroadcastq %xmm0, %xmm0326; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]327; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0328; X64-NEXT:    vmovdqa %xmm0, (%rsi)329; X64-NEXT:    retq330  %i0.src = load i32, ptr %origin331  %i0 = and i32 %i0.src, 15332  %i1 = insertelement <4 x i32> poison, i32 %i0, i64 0333  %i2 = insertelement <4 x i32> %i1, i32 42, i64 1334  %i3 = insertelement <4 x i32> %i2, i32 %i0, i64 2335  %i4 = insertelement <4 x i32> %i3, i32 42, i64 3336  %i5 = freeze <4 x i32> %i4337  %i6 = and <4 x i32> %i5, <i32 7, i32 7, i32 7, i32 7>338  store <4 x i32> %i6, ptr %dst339  ret void340}341 342define void @freeze_two_frozen_buildvectors(ptr %origin0, ptr %origin1, ptr %dst0, ptr %dst1) nounwind {343; X86-LABEL: freeze_two_frozen_buildvectors:344; X86:       # %bb.0:345; X86-NEXT:    pushl %esi346; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax347; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx348; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx349; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi350; X86-NEXT:    movl (%esi), %esi351; X86-NEXT:    andl $15, %esi352; X86-NEXT:    movl (%edx), %edx353; X86-NEXT:    andl $15, %edx354; X86-NEXT:    vmovd %esi, %xmm0355; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]356; X86-NEXT:    vpxor %xmm1, %xmm1, %xmm1357; X86-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]358; X86-NEXT:    vbroadcastss {{.*#+}} xmm2 = [7,7,7,7]359; X86-NEXT:    vpand %xmm2, %xmm0, %xmm0360; X86-NEXT:    vmovdqa %xmm0, (%ecx)361; X86-NEXT:    vmovd %edx, %xmm0362; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]363; X86-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5],xmm1[6,7]364; X86-NEXT:    vpand %xmm2, %xmm0, %xmm0365; X86-NEXT:    vmovdqa %xmm0, (%eax)366; X86-NEXT:    popl %esi367; X86-NEXT:    retl368;369; X64-LABEL: freeze_two_frozen_buildvectors:370; X64:       # %bb.0:371; X64-NEXT:    movl (%rsi), %eax372; X64-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero373; X64-NEXT:    vpbroadcastd %xmm0, %xmm0374; X64-NEXT:    vpxor %xmm1, %xmm1, %xmm1375; X64-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]376; X64-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [7,7,7,7]377; X64-NEXT:    vpand %xmm2, %xmm0, %xmm0378; X64-NEXT:    vmovdqa %xmm0, (%rdx)379; X64-NEXT:    vmovd %eax, %xmm0380; X64-NEXT:    vpbroadcastd %xmm0, %xmm0381; X64-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2],xmm1[3]382; X64-NEXT:    vpand %xmm2, %xmm0, %xmm0383; X64-NEXT:    vmovdqa %xmm0, (%rcx)384; X64-NEXT:    retq385  %i0.src = load i32, ptr %origin0386  %i0 = and i32 %i0.src, 15387  %i1.src = load i32, ptr %origin1388  %i1 = and i32 %i1.src, 15389  %i2 = insertelement <4 x i32> poison, i32 %i0, i64 1390  %i3 = and <4 x i32> %i2, <i32 7, i32 7, i32 7, i32 7>391  %i4 = freeze <4 x i32> %i3392  store <4 x i32> %i4, ptr %dst0393  %i5 = insertelement <4 x i32> poison, i32 %i1, i64 2394  %i6 = and <4 x i32> %i5, <i32 7, i32 7, i32 7, i32 7>395  %i7 = freeze <4 x i32> %i6396  store <4 x i32> %i7, ptr %dst1397  ret void398}399 400define void @freeze_two_buildvectors_only_one_frozen(ptr %origin0, ptr %origin1, ptr %dst0, ptr %dst1) nounwind {401; X86-LABEL: freeze_two_buildvectors_only_one_frozen:402; X86:       # %bb.0:403; X86-NEXT:    pushl %esi404; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax405; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx406; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx407; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi408; X86-NEXT:    movl (%esi), %esi409; X86-NEXT:    andl $15, %esi410; X86-NEXT:    vmovd %esi, %xmm0411; X86-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,1,1]412; X86-NEXT:    vpxor %xmm1, %xmm1, %xmm1413; X86-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]414; X86-NEXT:    vbroadcastss {{.*#+}} xmm1 = [7,7,7,7]415; X86-NEXT:    vpand %xmm1, %xmm0, %xmm0416; X86-NEXT:    vbroadcastss (%edx), %xmm2417; X86-NEXT:    vmovdqa %xmm0, (%ecx)418; X86-NEXT:    vpand %xmm1, %xmm2, %xmm0419; X86-NEXT:    vmovdqa %xmm0, (%eax)420; X86-NEXT:    popl %esi421; X86-NEXT:    retl422;423; X64-LABEL: freeze_two_buildvectors_only_one_frozen:424; X64:       # %bb.0:425; X64-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero426; X64-NEXT:    vbroadcastss %xmm0, %xmm0427; X64-NEXT:    vxorps %xmm1, %xmm1, %xmm1428; X64-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]429; X64-NEXT:    vbroadcastss {{.*#+}} xmm1 = [7,7,7,7]430; X64-NEXT:    vandps %xmm1, %xmm0, %xmm0431; X64-NEXT:    vbroadcastss (%rsi), %xmm2432; X64-NEXT:    vmovaps %xmm0, (%rdx)433; X64-NEXT:    vandps %xmm1, %xmm2, %xmm0434; X64-NEXT:    vmovaps %xmm0, (%rcx)435; X64-NEXT:    retq436  %i0.src = load i32, ptr %origin0437  %i0 = and i32 %i0.src, 15438  %i1.src = load i32, ptr %origin1439  %i1 = and i32 %i1.src, 15440  %i2 = insertelement <4 x i32> poison, i32 %i0, i64 1441  %i3 = and <4 x i32> %i2, <i32 7, i32 7, i32 7, i32 7>442  %i4 = freeze <4 x i32> %i3443  store <4 x i32> %i4, ptr %dst0444  %i5 = insertelement <4 x i32> poison, i32 %i1, i64 2445  %i6 = and <4 x i32> %i5, <i32 7, i32 7, i32 7, i32 7>446  store <4 x i32> %i6, ptr %dst1447  ret void448}449 450define void @freeze_two_buildvectors_one_undef_elt(ptr %origin0, ptr %origin1, ptr %dst0, ptr %dst1) nounwind {451; X86-LABEL: freeze_two_buildvectors_one_undef_elt:452; X86:       # %bb.0:453; X86-NEXT:    pushl %esi454; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax455; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx456; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx457; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi458; X86-NEXT:    movl (%esi), %esi459; X86-NEXT:    andl $15, %esi460; X86-NEXT:    vmovd %esi, %xmm0461; X86-NEXT:    vmovddup {{.*#+}} xmm1 = [7,0,7,0]462; X86-NEXT:    # xmm1 = mem[0,0]463; X86-NEXT:    vpand %xmm1, %xmm0, %xmm0464; X86-NEXT:    vmovddup {{.*#+}} xmm2 = mem[0,0]465; X86-NEXT:    vmovdqa %xmm0, (%ecx)466; X86-NEXT:    vpand %xmm1, %xmm2, %xmm0467; X86-NEXT:    vmovdqa %xmm0, (%eax)468; X86-NEXT:    popl %esi469; X86-NEXT:    retl470;471; X64-LABEL: freeze_two_buildvectors_one_undef_elt:472; X64:       # %bb.0:473; X64-NEXT:    movq (%rdi), %rax474; X64-NEXT:    andl $15, %eax475; X64-NEXT:    vmovd %eax, %xmm0476; X64-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [7,7]477; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0478; X64-NEXT:    vpbroadcastq (%rsi), %xmm2479; X64-NEXT:    vmovdqa %xmm0, (%rdx)480; X64-NEXT:    vpand %xmm1, %xmm2, %xmm0481; X64-NEXT:    vmovdqa %xmm0, (%rcx)482; X64-NEXT:    retq483  %i0.src = load i64, ptr %origin0484  %i0 = and i64 %i0.src, 15485  %i1.src = load i64, ptr %origin1486  %i1 = and i64 %i1.src, 15487  %i2 = insertelement <2 x i64> poison, i64 %i0, i64 0488  %i3 = and <2 x i64> %i2, <i64 7, i64 7>489  %i4 = freeze <2 x i64> %i3490  store <2 x i64> %i4, ptr %dst0491  %i5 = insertelement <2 x i64> poison, i64 %i1, i64 1492  %i6 = and <2 x i64> %i5, <i64 7, i64 7>493  store <2 x i64> %i6, ptr %dst1494  ret void495}496 497define void @freeze_buildvector(ptr %origin0, ptr %origin1, ptr %origin2, ptr %origin3, ptr %dst) nounwind {498; X86-LABEL: freeze_buildvector:499; X86:       # %bb.0:500; X86-NEXT:    pushl %edi501; X86-NEXT:    pushl %esi502; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax503; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx504; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx505; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi506; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi507; X86-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero508; X86-NEXT:    vpinsrd $1, (%esi), %xmm0, %xmm0509; X86-NEXT:    vpinsrd $2, (%edx), %xmm0, %xmm0510; X86-NEXT:    vpinsrd $3, (%ecx), %xmm0, %xmm0511; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0512; X86-NEXT:    vmovdqa %xmm0, (%eax)513; X86-NEXT:    popl %esi514; X86-NEXT:    popl %edi515; X86-NEXT:    retl516;517; X64-LABEL: freeze_buildvector:518; X64:       # %bb.0:519; X64-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero520; X64-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0521; X64-NEXT:    vpinsrd $2, (%rdx), %xmm0, %xmm0522; X64-NEXT:    vpinsrd $3, (%rcx), %xmm0, %xmm0523; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]524; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0525; X64-NEXT:    vmovdqa %xmm0, (%r8)526; X64-NEXT:    retq527  %i0.src = load i32, ptr %origin0528  %i1.src = load i32, ptr %origin1529  %i2.src = load i32, ptr %origin2530  %i3.src = load i32, ptr %origin3531  %i0 = and i32 %i0.src, 15532  %i1 = and i32 %i1.src, 15533  %i2 = and i32 %i2.src, 15534  %i3 = and i32 %i3.src, 15535  %i4 = insertelement <4 x i32> poison, i32 %i0, i64 0536  %i5 = insertelement <4 x i32> %i4, i32 %i1, i64 1537  %i6 = insertelement <4 x i32> %i5, i32 %i2, i64 2538  %i7 = insertelement <4 x i32> %i6, i32 %i3, i64 3539  %i8 = freeze <4 x i32> %i7540  %i9 = and <4 x i32> %i8, <i32 7, i32 7, i32 7, i32 7>541  store <4 x i32> %i9, ptr %dst542  ret void543}544 545define void @freeze_buildvector_one_undef_elt(ptr %origin0, ptr %origin1, ptr %origin2, ptr %origin3, ptr %dst) nounwind {546; X86-LABEL: freeze_buildvector_one_undef_elt:547; X86:       # %bb.0:548; X86-NEXT:    pushl %esi549; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax550; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx551; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx552; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi553; X86-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero554; X86-NEXT:    vpinsrd $1, (%edx), %xmm0, %xmm0555; X86-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0556; X86-NEXT:    vpinsrd $3, (%ecx), %xmm0, %xmm0557; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0558; X86-NEXT:    vmovdqa %xmm0, (%eax)559; X86-NEXT:    popl %esi560; X86-NEXT:    retl561;562; X64-LABEL: freeze_buildvector_one_undef_elt:563; X64:       # %bb.0:564; X64-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero565; X64-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0566; X64-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0567; X64-NEXT:    vpinsrd $3, (%rcx), %xmm0, %xmm0568; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]569; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0570; X64-NEXT:    vmovdqa %xmm0, (%r8)571; X64-NEXT:    retq572  %i0.src = load i32, ptr %origin0573  %i1.src = load i32, ptr %origin1574  %i3.src = load i32, ptr %origin3575  %i0 = and i32 %i0.src, 15576  %i1 = and i32 %i1.src, 15577  %i3 = and i32 %i3.src, 15578  %i4 = insertelement <4 x i32> poison, i32 %i0, i64 0579  %i5 = insertelement <4 x i32> %i4, i32 %i1, i64 1580  %i7 = insertelement <4 x i32> %i5, i32 %i3, i64 3581  %i8 = freeze <4 x i32> %i7582  %i9 = and <4 x i32> %i8, <i32 7, i32 7, i32 7, i32 7>583  store <4 x i32> %i9, ptr %dst584  ret void585}586 587define void @freeze_buildvector_extrause(ptr %origin0, ptr %origin1, ptr %origin2, ptr %origin3, ptr %dst, ptr %escape) nounwind {588; X86-LABEL: freeze_buildvector_extrause:589; X86:       # %bb.0:590; X86-NEXT:    pushl %ebx591; X86-NEXT:    pushl %edi592; X86-NEXT:    pushl %esi593; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax594; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx595; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx596; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi597; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi598; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebx599; X86-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero600; X86-NEXT:    vpinsrd $1, (%edi), %xmm0, %xmm0601; X86-NEXT:    vpinsrd $2, (%esi), %xmm0, %xmm0602; X86-NEXT:    vpinsrd $3, (%edx), %xmm0, %xmm0603; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm1604; X86-NEXT:    vmovdqa %xmm1, (%ecx)605; X86-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0606; X86-NEXT:    vmovdqa %xmm0, (%eax)607; X86-NEXT:    popl %esi608; X86-NEXT:    popl %edi609; X86-NEXT:    popl %ebx610; X86-NEXT:    retl611;612; X64-LABEL: freeze_buildvector_extrause:613; X64:       # %bb.0:614; X64-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero615; X64-NEXT:    vpinsrd $1, (%rsi), %xmm0, %xmm0616; X64-NEXT:    vpinsrd $2, (%rdx), %xmm0, %xmm0617; X64-NEXT:    vpinsrd $3, (%rcx), %xmm0, %xmm0618; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [15,15,15,15]619; X64-NEXT:    vpand %xmm1, %xmm0, %xmm1620; X64-NEXT:    vmovdqa %xmm1, (%r9)621; X64-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]622; X64-NEXT:    vpand %xmm1, %xmm0, %xmm0623; X64-NEXT:    vmovdqa %xmm0, (%r8)624; X64-NEXT:    retq625  %i0.src = load i32, ptr %origin0626  %i1.src = load i32, ptr %origin1627  %i2.src = load i32, ptr %origin2628  %i3.src = load i32, ptr %origin3629  %i0 = and i32 %i0.src, 15630  %i1 = and i32 %i1.src, 15631  %i2 = and i32 %i2.src, 15632  %i3 = and i32 %i3.src, 15633  %i4 = insertelement <4 x i32> poison, i32 %i0, i64 0634  %i5 = insertelement <4 x i32> %i4, i32 %i1, i64 1635  %i6 = insertelement <4 x i32> %i5, i32 %i2, i64 2636  %i7 = insertelement <4 x i32> %i6, i32 %i3, i64 3637  store <4 x i32> %i7, ptr %escape638  %i8 = freeze <4 x i32> %i7639  %i9 = and <4 x i32> %i8, <i32 7, i32 7, i32 7, i32 7>640  store <4 x i32> %i9, ptr %dst641  ret void642}643 644define void @pr59677(i32 %x, ptr %out) nounwind {645; X86-LABEL: pr59677:646; X86:       # %bb.0:647; X86-NEXT:    pushl %esi648; X86-NEXT:    pushl %eax649; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi650; X86-NEXT:    vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero651; X86-NEXT:    vpaddd %xmm0, %xmm0, %xmm0652; X86-NEXT:    vcvtdq2ps %xmm0, %xmm0653; X86-NEXT:    vmovss %xmm0, (%esp)654; X86-NEXT:    calll sinf655; X86-NEXT:    fstps (%esi)656; X86-NEXT:    addl $4, %esp657; X86-NEXT:    popl %esi658; X86-NEXT:    retl659;660; X64-LABEL: pr59677:661; X64:       # %bb.0:662; X64-NEXT:    pushq %rbx663; X64-NEXT:    movq %rsi, %rbx664; X64-NEXT:    vmovd %edi, %xmm0665; X64-NEXT:    vpaddd %xmm0, %xmm0, %xmm0666; X64-NEXT:    vcvtdq2ps %xmm0, %xmm0667; X64-NEXT:    callq sinf@PLT668; X64-NEXT:    vmovss %xmm0, (%rbx)669; X64-NEXT:    popq %rbx670; X64-NEXT:    retq671  %i0 = or i32 %x, 1672  %i1 = insertelement <4 x i32> zeroinitializer, i32 %x, i64 0673  %i2 = insertelement <4 x i32> %i1, i32 %i0, i64 1674  %i3 = shl <4 x i32> %i2, <i32 1, i32 1, i32 1, i32 1>675  %i4 = sitofp <4 x i32> %i3 to <4 x float>676  %i5 = tail call <4 x float> @llvm.sin.v4f32(<4 x float> %i4)677  %i6 = extractelement <4 x float> %i5, i64 0678  store float %i6, ptr %out, align 4679  ret void680}681declare <4 x float> @llvm.sin.v4f32(<4 x float>)682 683; Test that we can eliminate freeze by changing the BUILD_VECTOR to a splat684; zero vector.685define void @freeze_buildvector_not_simple_type(ptr %dst) nounwind {686; X86-LABEL: freeze_buildvector_not_simple_type:687; X86:       # %bb.0:688; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax689; X86-NEXT:    movb $0, 4(%eax)690; X86-NEXT:    movl $0, (%eax)691; X86-NEXT:    retl692;693; X64-LABEL: freeze_buildvector_not_simple_type:694; X64:       # %bb.0:695; X64-NEXT:    movb $0, 4(%rdi)696; X64-NEXT:    movl $0, (%rdi)697; X64-NEXT:    retq698  %i0 = freeze <5 x i8> <i8 poison, i8 0, i8 0, i8 undef, i8 0>699  store <5 x i8> %i0, ptr %dst700  ret void701}702