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