711 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX24; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX5125 6declare void @use_v8i1(<8 x i1>)7declare void @use_v8i8(<8 x i8>)8 9define <8 x i16> @cmp_ne_load_const(ptr %x) nounwind {10; SSE-LABEL: cmp_ne_load_const:11; SSE: # %bb.0:12; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero13; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]14; SSE-NEXT: pxor %xmm1, %xmm115; SSE-NEXT: pcmpeqb %xmm0, %xmm116; SSE-NEXT: pcmpeqd %xmm0, %xmm017; SSE-NEXT: pxor %xmm1, %xmm018; SSE-NEXT: retq19;20; AVX-LABEL: cmp_ne_load_const:21; AVX: # %bb.0:22; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero23; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm124; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm025; AVX-NEXT: retq26 %loadx = load <8 x i8>, ptr %x27 %icmp = icmp ne <8 x i8> %loadx, zeroinitializer28 %sext = sext <8 x i1> %icmp to <8 x i16>29 ret <8 x i16> %sext30}31 32; negative test - simple loads only33 34define <8 x i16> @cmp_ne_load_const_volatile(ptr %x) nounwind {35; SSE-LABEL: cmp_ne_load_const_volatile:36; SSE: # %bb.0:37; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero38; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]39; SSE-NEXT: pxor %xmm1, %xmm140; SSE-NEXT: pcmpeqb %xmm0, %xmm141; SSE-NEXT: pcmpeqd %xmm0, %xmm042; SSE-NEXT: pxor %xmm1, %xmm043; SSE-NEXT: retq44;45; AVX2-LABEL: cmp_ne_load_const_volatile:46; AVX2: # %bb.0:47; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero48; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm149; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm050; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm151; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm052; AVX2-NEXT: vpmovsxbw %xmm0, %xmm053; AVX2-NEXT: retq54;55; AVX512-LABEL: cmp_ne_load_const_volatile:56; AVX512: # %bb.0:57; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero58; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm159; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm060; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm061; AVX512-NEXT: vpmovsxbw %xmm0, %xmm062; AVX512-NEXT: vzeroupper63; AVX512-NEXT: retq64 %loadx = load volatile <8 x i8>, ptr %x65 %icmp = icmp ne <8 x i8> %loadx, zeroinitializer66 %sext = sext <8 x i1> %icmp to <8 x i16>67 ret <8 x i16> %sext68}69 70; negative test - don't create extra load71 72define <8 x i16> @cmp_ne_load_const_extra_use1(ptr %x) nounwind {73; SSE-LABEL: cmp_ne_load_const_extra_use1:74; SSE: # %bb.0:75; SSE-NEXT: subq $24, %rsp76; SSE-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero77; SSE-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill78; SSE-NEXT: callq use_v8i8@PLT79; SSE-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload80; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]81; SSE-NEXT: pxor %xmm1, %xmm182; SSE-NEXT: pcmpeqb %xmm0, %xmm183; SSE-NEXT: pcmpeqd %xmm0, %xmm084; SSE-NEXT: pxor %xmm1, %xmm085; SSE-NEXT: addq $24, %rsp86; SSE-NEXT: retq87;88; AVX2-LABEL: cmp_ne_load_const_extra_use1:89; AVX2: # %bb.0:90; AVX2-NEXT: subq $24, %rsp91; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero92; AVX2-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill93; AVX2-NEXT: callq use_v8i8@PLT94; AVX2-NEXT: vpxor %xmm0, %xmm0, %xmm095; AVX2-NEXT: vpcmpeqb (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload96; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm197; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm098; AVX2-NEXT: vpmovsxbw %xmm0, %xmm099; AVX2-NEXT: addq $24, %rsp100; AVX2-NEXT: retq101;102; AVX512-LABEL: cmp_ne_load_const_extra_use1:103; AVX512: # %bb.0:104; AVX512-NEXT: subq $24, %rsp105; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero106; AVX512-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill107; AVX512-NEXT: callq use_v8i8@PLT108; AVX512-NEXT: vpxor %xmm0, %xmm0, %xmm0109; AVX512-NEXT: vpcmpeqb (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload110; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0111; AVX512-NEXT: vpmovsxbw %xmm0, %xmm0112; AVX512-NEXT: addq $24, %rsp113; AVX512-NEXT: vzeroupper114; AVX512-NEXT: retq115 %loadx = load <8 x i8>, ptr %x116 call void @use_v8i8(<8 x i8> %loadx)117 %icmp = icmp ne <8 x i8> %loadx, zeroinitializer118 %sext = sext <8 x i1> %icmp to <8 x i16>119 ret <8 x i16> %sext120}121 122; negative test - don't create extra compare123 124define <8 x i16> @cmp_ne_load_const_extra_use2(ptr %x) nounwind {125; SSE-LABEL: cmp_ne_load_const_extra_use2:126; SSE: # %bb.0:127; SSE-NEXT: subq $24, %rsp128; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero129; SSE-NEXT: pxor %xmm1, %xmm1130; SSE-NEXT: pcmpeqb %xmm0, %xmm1131; SSE-NEXT: pcmpeqd %xmm0, %xmm0132; SSE-NEXT: pxor %xmm1, %xmm0133; SSE-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill134; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]135; SSE-NEXT: callq use_v8i1@PLT136; SSE-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload137; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]138; SSE-NEXT: addq $24, %rsp139; SSE-NEXT: retq140;141; AVX2-LABEL: cmp_ne_load_const_extra_use2:142; AVX2: # %bb.0:143; AVX2-NEXT: subq $24, %rsp144; AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero145; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1146; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0147; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1148; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0149; AVX2-NEXT: vmovdqa %xmm0, (%rsp) # 16-byte Spill150; AVX2-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero151; AVX2-NEXT: callq use_v8i1@PLT152; AVX2-NEXT: vpmovsxbw (%rsp), %xmm0 # 16-byte Folded Reload153; AVX2-NEXT: addq $24, %rsp154; AVX2-NEXT: retq155;156; AVX512-LABEL: cmp_ne_load_const_extra_use2:157; AVX512: # %bb.0:158; AVX512-NEXT: subq $72, %rsp159; AVX512-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero160; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1161; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0162; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0163; AVX512-NEXT: vmovdqu64 %zmm0, (%rsp) # 64-byte Spill164; AVX512-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero165; AVX512-NEXT: vzeroupper166; AVX512-NEXT: callq use_v8i1@PLT167; AVX512-NEXT: vpmovsxbw (%rsp), %xmm0 # 16-byte Folded Reload168; AVX512-NEXT: addq $72, %rsp169; AVX512-NEXT: retq170 %loadx = load <8 x i8>, ptr %x171 %icmp = icmp ne <8 x i8> %loadx, zeroinitializer172 call void @use_v8i1(<8 x i1> %icmp)173 %sext = sext <8 x i1> %icmp to <8 x i16>174 ret <8 x i16> %sext175}176 177; negative test - not free extend178 179define <8 x i16> @cmp_ne_no_load_const(i64 %x) nounwind {180; SSE-LABEL: cmp_ne_no_load_const:181; SSE: # %bb.0:182; SSE-NEXT: movq %rdi, %xmm0183; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]184; SSE-NEXT: pxor %xmm1, %xmm1185; SSE-NEXT: pcmpeqb %xmm0, %xmm1186; SSE-NEXT: pcmpeqd %xmm0, %xmm0187; SSE-NEXT: pxor %xmm1, %xmm0188; SSE-NEXT: retq189;190; AVX2-LABEL: cmp_ne_no_load_const:191; AVX2: # %bb.0:192; AVX2-NEXT: vmovq %rdi, %xmm0193; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1194; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0195; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1196; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0197; AVX2-NEXT: vpmovsxbw %xmm0, %xmm0198; AVX2-NEXT: retq199;200; AVX512-LABEL: cmp_ne_no_load_const:201; AVX512: # %bb.0:202; AVX512-NEXT: vmovq %rdi, %xmm0203; AVX512-NEXT: vpxor %xmm1, %xmm1, %xmm1204; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0205; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0206; AVX512-NEXT: vpmovsxbw %xmm0, %xmm0207; AVX512-NEXT: vzeroupper208; AVX512-NEXT: retq209 %t = bitcast i64 %x to <8 x i8>210 %icmp = icmp ne <8 x i8> %t, zeroinitializer211 %sext = sext <8 x i1> %icmp to <8 x i16>212 ret <8 x i16> %sext213}214 215define <4 x i32> @cmp_ult_load_const(ptr %x) nounwind {216; SSE-LABEL: cmp_ult_load_const:217; SSE: # %bb.0:218; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero219; SSE-NEXT: movd {{.*#+}} xmm1 = [42,214,0,255,0,0,0,0,0,0,0,0,0,0,0,0]220; SSE-NEXT: pmaxub %xmm0, %xmm1221; SSE-NEXT: pcmpeqb %xmm0, %xmm1222; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]223; SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]224; SSE-NEXT: pcmpeqd %xmm0, %xmm0225; SSE-NEXT: pxor %xmm1, %xmm0226; SSE-NEXT: retq227;228; AVX-LABEL: cmp_ult_load_const:229; AVX: # %bb.0:230; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero231; AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = [42,214,0,255]232; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0233; AVX-NEXT: retq234 %loadx = load <4 x i8>, ptr %x235 %icmp = icmp ult <4 x i8> %loadx, <i8 42, i8 -42, i8 0, i8 -1>236 %sext = sext <4 x i1> %icmp to <4 x i32>237 ret <4 x i32> %sext238}239 240; negative test - type must be legal241 242define <3 x i32> @cmp_ult_load_const_bad_type(ptr %x) nounwind {243; SSE-LABEL: cmp_ult_load_const_bad_type:244; SSE: # %bb.0:245; SSE-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero246; SSE-NEXT: movd {{.*#+}} xmm1 = [42,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0]247; SSE-NEXT: pmaxub %xmm0, %xmm1248; SSE-NEXT: pcmpeqb %xmm0, %xmm1249; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]250; SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]251; SSE-NEXT: pcmpeqd %xmm0, %xmm0252; SSE-NEXT: pxor %xmm1, %xmm0253; SSE-NEXT: retq254;255; AVX2-LABEL: cmp_ult_load_const_bad_type:256; AVX2: # %bb.0:257; AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero258; AVX2-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1259; AVX2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0260; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1261; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0262; AVX2-NEXT: vpmovsxbd %xmm0, %xmm0263; AVX2-NEXT: retq264;265; AVX512-LABEL: cmp_ult_load_const_bad_type:266; AVX512: # %bb.0:267; AVX512-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero268; AVX512-NEXT: vpmaxub {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1269; AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0270; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0271; AVX512-NEXT: vpmovsxbd %xmm0, %xmm0272; AVX512-NEXT: vzeroupper273; AVX512-NEXT: retq274 %loadx = load <3 x i8>, ptr %x275 %icmp = icmp ult <3 x i8> %loadx, <i8 42, i8 -42, i8 0>276 %sext = sext <3 x i1> %icmp to <3 x i32>277 ret <3 x i32> %sext278}279 280; Signed compare needs signed extend.281 282define <4 x i32> @cmp_slt_load_const(ptr %x) nounwind {283; SSE-LABEL: cmp_slt_load_const:284; SSE: # %bb.0:285; SSE-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero286; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]287; SSE-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]288; SSE-NEXT: movdqa {{.*#+}} xmm0 = [10794,10794,54998,54998,0,0,65535,65535]289; SSE-NEXT: pcmpgtb %xmm1, %xmm0290; SSE-NEXT: retq291;292; AVX-LABEL: cmp_slt_load_const:293; AVX: # %bb.0:294; AVX-NEXT: vpmovsxbd (%rdi), %xmm0295; AVX-NEXT: vpmovsxbd {{.*#+}} xmm1 = [42,4294967254,0,4294967295]296; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0297; AVX-NEXT: retq298 %loadx = load <4 x i8>, ptr %x299 %icmp = icmp slt <4 x i8> %loadx, <i8 42, i8 -42, i8 0, i8 -1>300 %sext = sext <4 x i1> %icmp to <4 x i32>301 ret <4 x i32> %sext302}303 304define <2 x i64> @cmp_ne_zextload(ptr %x, ptr %y) nounwind {305; SSE-LABEL: cmp_ne_zextload:306; SSE: # %bb.0:307; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero308; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero309; SSE-NEXT: pcmpeqd %xmm0, %xmm1310; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]311; SSE-NEXT: pcmpeqd %xmm0, %xmm0312; SSE-NEXT: pxor %xmm1, %xmm0313; SSE-NEXT: retq314;315; AVX2-LABEL: cmp_ne_zextload:316; AVX2: # %bb.0:317; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero318; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero319; AVX2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0320; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1321; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0322; AVX2-NEXT: retq323;324; AVX512-LABEL: cmp_ne_zextload:325; AVX512: # %bb.0:326; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero327; AVX512-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero328; AVX512-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0329; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0330; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0331; AVX512-NEXT: vzeroupper332; AVX512-NEXT: retq333 %loadx = load <2 x i32>, ptr %x334 %loady = load <2 x i32>, ptr %y335 %icmp = icmp ne <2 x i32> %loadx, %loady336 %sext = sext <2 x i1> %icmp to <2 x i64>337 ret <2 x i64> %sext338}339 340define <8 x i16> @cmp_ugt_zextload(ptr %x, ptr %y) nounwind {341; SSE-LABEL: cmp_ugt_zextload:342; SSE: # %bb.0:343; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero344; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero345; SSE-NEXT: pminub %xmm0, %xmm1346; SSE-NEXT: pcmpeqb %xmm0, %xmm1347; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]348; SSE-NEXT: pcmpeqd %xmm0, %xmm0349; SSE-NEXT: pxor %xmm1, %xmm0350; SSE-NEXT: retq351;352; AVX-LABEL: cmp_ugt_zextload:353; AVX: # %bb.0:354; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero355; AVX-NEXT: vpmovzxbw {{.*#+}} xmm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero356; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0357; AVX-NEXT: retq358 %loadx = load <8 x i8>, ptr %x359 %loady = load <8 x i8>, ptr %y360 %icmp = icmp ugt <8 x i8> %loadx, %loady361 %sext = sext <8 x i1> %icmp to <8 x i16>362 ret <8 x i16> %sext363}364 365; Signed compare needs signed extends.366 367define <8 x i16> @cmp_sgt_zextload(ptr %x, ptr %y) nounwind {368; SSE-LABEL: cmp_sgt_zextload:369; SSE: # %bb.0:370; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero371; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero372; SSE-NEXT: pcmpgtb %xmm1, %xmm0373; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]374; SSE-NEXT: retq375;376; AVX-LABEL: cmp_sgt_zextload:377; AVX: # %bb.0:378; AVX-NEXT: vpmovsxbw (%rdi), %xmm0379; AVX-NEXT: vpmovsxbw (%rsi), %xmm1380; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0381; AVX-NEXT: retq382 %loadx = load <8 x i8>, ptr %x383 %loady = load <8 x i8>, ptr %y384 %icmp = icmp sgt <8 x i8> %loadx, %loady385 %sext = sext <8 x i1> %icmp to <8 x i16>386 ret <8 x i16> %sext387}388 389; negative test - don't change a legal op390; TODO: Or should we? We can eliminate the vpmovsxwd at the cost of a 256-bit ymm vpcmpeqw.391 392define <8 x i32> @cmp_ne_zextload_from_legal_op(ptr %x, ptr %y) {393; SSE-LABEL: cmp_ne_zextload_from_legal_op:394; SSE: # %bb.0:395; SSE-NEXT: movdqa (%rdi), %xmm0396; SSE-NEXT: pcmpeqw (%rsi), %xmm0397; SSE-NEXT: pcmpeqd %xmm1, %xmm1398; SSE-NEXT: pxor %xmm0, %xmm1399; SSE-NEXT: movdqa %xmm1, %xmm0400; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]401; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]402; SSE-NEXT: retq403;404; AVX2-LABEL: cmp_ne_zextload_from_legal_op:405; AVX2: # %bb.0:406; AVX2-NEXT: vmovdqa (%rdi), %xmm0407; AVX2-NEXT: vpcmpeqw (%rsi), %xmm0, %xmm0408; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1409; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0410; AVX2-NEXT: vpmovsxwd %xmm0, %ymm0411; AVX2-NEXT: retq412;413; AVX512-LABEL: cmp_ne_zextload_from_legal_op:414; AVX512: # %bb.0:415; AVX512-NEXT: vmovdqa (%rdi), %xmm0416; AVX512-NEXT: vpcmpeqw (%rsi), %xmm0, %xmm0417; AVX512-NEXT: vpternlogq {{.*#+}} zmm0 = ~zmm0418; AVX512-NEXT: vpmovsxwd %xmm0, %ymm0419; AVX512-NEXT: retq420 %loadx = load <8 x i16>, ptr %x421 %loady = load <8 x i16>, ptr %y422 %icmp = icmp ne <8 x i16> %loadx, %loady423 %sext = sext <8 x i1> %icmp to <8 x i32>424 ret <8 x i32> %sext425}426 427; Both uses of the load can be absorbed by the zext-load, so we eliminate the explicit casts.428 429define <8 x i32> @PR50055(ptr %src, ptr %dst) nounwind {430; SSE-LABEL: PR50055:431; SSE: # %bb.0:432; SSE-NEXT: movq {{.*#+}} xmm2 = mem[0],zero433; SSE-NEXT: pxor %xmm3, %xmm3434; SSE-NEXT: movdqa %xmm2, %xmm1435; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]436; SSE-NEXT: movdqa %xmm1, %xmm0437; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]438; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]439; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]440; SSE-NEXT: pcmpeqb %xmm3, %xmm2441; SSE-NEXT: pcmpeqd %xmm3, %xmm3442; SSE-NEXT: pxor %xmm2, %xmm3443; SSE-NEXT: movdqa %xmm3, %xmm2444; SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]445; SSE-NEXT: punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]446; SSE-NEXT: movdqa %xmm3, 16(%rsi)447; SSE-NEXT: movdqa %xmm2, (%rsi)448; SSE-NEXT: retq449;450; AVX-LABEL: PR50055:451; AVX: # %bb.0:452; AVX-NEXT: vpmovzxbd {{.*#+}} ymm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero,mem[4],zero,zero,zero,mem[5],zero,zero,zero,mem[6],zero,zero,zero,mem[7],zero,zero,zero453; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1454; AVX-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm1455; AVX-NEXT: vmovdqa %ymm1, (%rsi)456; AVX-NEXT: retq457 %load = load <8 x i8>, ptr %src458 %zext = zext <8 x i8> %load to <8 x i32>459 %icmp = icmp ne <8 x i8> %load, zeroinitializer460 %sext = sext <8 x i1> %icmp to <8 x i32>461 store <8 x i32> %sext, ptr %dst462 ret <8 x i32> %zext463}464 465; negative test - extra uses must be absorbable by a zext-load.466 467define <8 x i16> @multi_use_narrower_size(ptr %src, ptr %dst) nounwind {468; SSE-LABEL: multi_use_narrower_size:469; SSE: # %bb.0:470; SSE-NEXT: movq {{.*#+}} xmm1 = mem[0],zero471; SSE-NEXT: pxor %xmm2, %xmm2472; SSE-NEXT: movdqa %xmm1, %xmm0473; SSE-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]474; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]475; SSE-NEXT: pcmpeqb %xmm2, %xmm1476; SSE-NEXT: movdqa %xmm1, %xmm2477; SSE-NEXT: punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]478; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]479; SSE-NEXT: movdqa %xmm1, 16(%rsi)480; SSE-NEXT: movdqa %xmm2, (%rsi)481; SSE-NEXT: retq482;483; AVX-LABEL: multi_use_narrower_size:484; AVX: # %bb.0:485; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero486; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero487; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2488; AVX-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1489; AVX-NEXT: vpmovsxbd %xmm1, %ymm1490; AVX-NEXT: vmovdqa %ymm1, (%rsi)491; AVX-NEXT: vzeroupper492; AVX-NEXT: retq493 %load = load <8 x i8>, ptr %src494 %zext = zext <8 x i8> %load to <8 x i16>495 %icmp = icmp eq <8 x i8> %load, zeroinitializer496 %sext = sext <8 x i1> %icmp to <8 x i32>497 store <8 x i32> %sext, ptr %dst498 ret <8 x i16> %zext499}500 501; negative test - extra uses must be absorbable by a zext-load.502 503define <8 x i32> @multi_use_wider_size(ptr %src, ptr %dst) nounwind {504; SSE-LABEL: multi_use_wider_size:505; SSE: # %bb.0:506; SSE-NEXT: movq {{.*#+}} xmm2 = mem[0],zero507; SSE-NEXT: pxor %xmm3, %xmm3508; SSE-NEXT: movdqa %xmm2, %xmm1509; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]510; SSE-NEXT: movdqa %xmm1, %xmm0511; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]512; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]513; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]514; SSE-NEXT: pcmpeqb %xmm3, %xmm2515; SSE-NEXT: movdqa %xmm2, (%rsi)516; SSE-NEXT: retq517;518; AVX-LABEL: multi_use_wider_size:519; AVX: # %bb.0:520; AVX-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero521; AVX-NEXT: vpmovzxbd {{.*#+}} ymm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero522; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2523; AVX-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1524; AVX-NEXT: vpmovsxbw %xmm1, %xmm1525; AVX-NEXT: vmovdqa %xmm1, (%rsi)526; AVX-NEXT: retq527 %load = load <8 x i8>, ptr %src528 %zext = zext <8 x i8> %load to <8 x i32>529 %icmp = icmp eq <8 x i8> %load, zeroinitializer530 %sext = sext <8 x i1> %icmp to <8 x i16>531 store <8 x i16> %sext, ptr %dst532 ret <8 x i32> %zext533}534 535define <4 x i64> @PR50055_signed(ptr %src, ptr %dst) {536; SSE-LABEL: PR50055_signed:537; SSE: # %bb.0:538; SSE-NEXT: movq {{.*#+}} xmm2 = mem[0],zero539; SSE-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]540; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]541; SSE-NEXT: psrad $24, %xmm0542; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]543; SSE-NEXT: psrad $24, %xmm1544; SSE-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]545; SSE-NEXT: pxor %xmm3, %xmm3546; SSE-NEXT: pcmpgtb %xmm3, %xmm2547; SSE-NEXT: movdqa %xmm2, %xmm3548; SSE-NEXT: punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]549; SSE-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]550; SSE-NEXT: movdqa %xmm2, 16(%rsi)551; SSE-NEXT: movdqa %xmm3, (%rsi)552; SSE-NEXT: retq553;554; AVX-LABEL: PR50055_signed:555; AVX: # %bb.0:556; AVX-NEXT: vpmovsxbd (%rdi), %ymm0557; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1558; AVX-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm1559; AVX-NEXT: vmovdqa %ymm1, (%rsi)560; AVX-NEXT: retq561 %t1 = load <8 x i8>, ptr %src, align 1562 %conv = sext <8 x i8> %t1 to <8 x i32>563 %t2 = bitcast <8 x i32> %conv to <4 x i64>564 %cmp = icmp sgt <8 x i8> %t1, zeroinitializer565 %sext = sext <8 x i1> %cmp to <8 x i32>566 store <8 x i32> %sext, ptr %dst, align 32567 ret <4 x i64> %t2568}569 570define <8 x i32> @PR63946(<8 x i32> %a0, <8 x i32> %b0) nounwind {571; SSE-LABEL: PR63946:572; SSE: # %bb.0: # %entry573; SSE-NEXT: movdqa %xmm1, %xmm4574; SSE-NEXT: movdqa %xmm0, %xmm13575; SSE-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,2,3,0]576; SSE-NEXT: pshufd {{.*#+}} xmm9 = xmm3[1,2,3,0]577; SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm3[2,3,0,1]578; SSE-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,0,1]579; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm3[3,0,1,2]580; SSE-NEXT: pshufd {{.*#+}} xmm6 = xmm2[3,0,1,2]581; SSE-NEXT: pcmpeqd %xmm2, %xmm0582; SSE-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill583; SSE-NEXT: movdqa %xmm9, %xmm11584; SSE-NEXT: pcmpeqd %xmm4, %xmm11585; SSE-NEXT: movdqa %xmm7, %xmm12586; SSE-NEXT: movdqa %xmm8, %xmm10587; SSE-NEXT: movdqa %xmm5, %xmm15588; SSE-NEXT: pcmpeqd %xmm4, %xmm15589; SSE-NEXT: movdqa %xmm1, %xmm14590; SSE-NEXT: pcmpeqd %xmm4, %xmm14591; SSE-NEXT: pcmpeqd %xmm4, %xmm2592; SSE-NEXT: pcmpeqd %xmm4, %xmm7593; SSE-NEXT: pcmpeqd %xmm4, %xmm8594; SSE-NEXT: movdqa %xmm6, %xmm0595; SSE-NEXT: pcmpeqd %xmm4, %xmm6596; SSE-NEXT: pcmpeqd %xmm3, %xmm4597; SSE-NEXT: por %xmm4, %xmm11598; SSE-NEXT: pcmpeqd %xmm13, %xmm12599; SSE-NEXT: por {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Folded Reload600; SSE-NEXT: pcmpeqd %xmm13, %xmm10601; SSE-NEXT: pcmpeqd %xmm13, %xmm0602; SSE-NEXT: por %xmm15, %xmm2603; SSE-NEXT: por %xmm11, %xmm2604; SSE-NEXT: pcmpeqd %xmm13, %xmm3605; SSE-NEXT: por %xmm3, %xmm10606; SSE-NEXT: por %xmm12, %xmm10607; SSE-NEXT: por %xmm14, %xmm7608; SSE-NEXT: pcmpeqd %xmm13, %xmm9609; SSE-NEXT: por %xmm0, %xmm9610; SSE-NEXT: pcmpeqd %xmm13, %xmm5611; SSE-NEXT: por %xmm9, %xmm5612; SSE-NEXT: por %xmm10, %xmm5613; SSE-NEXT: por %xmm7, %xmm8614; SSE-NEXT: por %xmm2, %xmm8615; SSE-NEXT: packssdw %xmm8, %xmm5616; SSE-NEXT: pcmpeqd %xmm13, %xmm1617; SSE-NEXT: packssdw %xmm6, %xmm1618; SSE-NEXT: por %xmm5, %xmm1619; SSE-NEXT: movdqa %xmm1, %xmm0620; SSE-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]621; SSE-NEXT: pslld $31, %xmm0622; SSE-NEXT: psrad $31, %xmm0623; SSE-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]624; SSE-NEXT: pslld $31, %xmm1625; SSE-NEXT: psrad $31, %xmm1626; SSE-NEXT: retq627;628; AVX2-LABEL: PR63946:629; AVX2: # %bb.0: # %entry630; AVX2-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,2,3,0,5,6,7,4]631; AVX2-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[2,3,0,1,6,7,4,5]632; AVX2-NEXT: vpshufd {{.*#+}} ymm4 = ymm1[3,0,1,2,7,4,5,6]633; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm1[2,3,0,1]634; AVX2-NEXT: vpermq {{.*#+}} ymm6 = ymm2[2,3,0,1]635; AVX2-NEXT: vpermq {{.*#+}} ymm7 = ymm3[2,3,0,1]636; AVX2-NEXT: vpermq {{.*#+}} ymm8 = ymm4[2,3,0,1]637; AVX2-NEXT: vpcmpeqd %ymm1, %ymm0, %ymm1638; AVX2-NEXT: vpcmpeqd %ymm0, %ymm2, %ymm2639; AVX2-NEXT: vpor %ymm1, %ymm2, %ymm1640; AVX2-NEXT: vpcmpeqd %ymm0, %ymm3, %ymm2641; AVX2-NEXT: vpcmpeqd %ymm0, %ymm4, %ymm3642; AVX2-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm4643; AVX2-NEXT: vpor %ymm4, %ymm2, %ymm2644; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1645; AVX2-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm2646; AVX2-NEXT: vpor %ymm2, %ymm3, %ymm2647; AVX2-NEXT: vpor %ymm2, %ymm1, %ymm1648; AVX2-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm2649; AVX2-NEXT: vpcmpeqd %ymm0, %ymm8, %ymm0650; AVX2-NEXT: vpor %ymm0, %ymm2, %ymm0651; AVX2-NEXT: vpor %ymm0, %ymm1, %ymm0652; AVX2-NEXT: vpslld $31, %ymm0, %ymm0653; AVX2-NEXT: vpsrad $31, %ymm0, %ymm0654; AVX2-NEXT: retq655;656; AVX512-LABEL: PR63946:657; AVX512: # %bb.0: # %entry658; AVX512-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1659; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0660; AVX512-NEXT: vpshufd {{.*#+}} ymm2 = ymm1[1,2,3,0,5,6,7,4]661; AVX512-NEXT: vpshufd {{.*#+}} ymm3 = ymm1[2,3,0,1,6,7,4,5]662; AVX512-NEXT: vpshufd {{.*#+}} ymm4 = ymm1[3,0,1,2,7,4,5,6]663; AVX512-NEXT: vpermq {{.*#+}} ymm5 = ymm1[2,3,0,1]664; AVX512-NEXT: vpermq {{.*#+}} ymm6 = ymm2[2,3,0,1]665; AVX512-NEXT: vpermq {{.*#+}} ymm7 = ymm3[2,3,0,1]666; AVX512-NEXT: vpermq {{.*#+}} ymm8 = ymm4[2,3,0,1]667; AVX512-NEXT: vpcmpeqd %zmm1, %zmm0, %k0668; AVX512-NEXT: vpcmpeqd %zmm0, %zmm2, %k1669; AVX512-NEXT: vpcmpeqd %zmm0, %zmm3, %k3670; AVX512-NEXT: vpcmpeqd %zmm0, %zmm4, %k2671; AVX512-NEXT: vpcmpeqd %zmm0, %zmm5, %k4672; AVX512-NEXT: vpcmpeqd %zmm0, %zmm6, %k5673; AVX512-NEXT: vpcmpeqd %zmm0, %zmm7, %k6674; AVX512-NEXT: vpcmpeqd %zmm0, %zmm8, %k7675; AVX512-NEXT: korw %k0, %k1, %k0676; AVX512-NEXT: korw %k3, %k0, %k0677; AVX512-NEXT: korw %k4, %k0, %k0678; AVX512-NEXT: korw %k2, %k0, %k0679; AVX512-NEXT: korw %k5, %k0, %k0680; AVX512-NEXT: korw %k6, %k0, %k0681; AVX512-NEXT: korw %k7, %k0, %k1682; AVX512-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1683; AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0684; AVX512-NEXT: retq685entry:686 %shuffle = shufflevector <8 x i32> %b0, <8 x i32> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 5, i32 6, i32 7, i32 4>687 %shuffle1 = shufflevector <8 x i32> %b0, <8 x i32> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>688 %shuffle2 = shufflevector <8 x i32> %shuffle, <8 x i32> poison, <8 x i32> <i32 2, i32 3, i32 0, i32 1, i32 6, i32 7, i32 4, i32 5>689 %shuffle3 = shufflevector <8 x i32> %b0, <8 x i32> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>690 %shuffle4 = shufflevector <8 x i32> %shuffle, <8 x i32> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>691 %shuffle5 = shufflevector <8 x i32> %shuffle1, <8 x i32> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>692 %shuffle6 = shufflevector <8 x i32> %shuffle2, <8 x i32> poison, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3>693 %cmp = icmp eq <8 x i32> %a0, %b0694 %cmp7 = icmp eq <8 x i32> %shuffle, %a0695 %cmp9 = icmp eq <8 x i32> %shuffle1, %a0696 %cmp11 = icmp eq <8 x i32> %shuffle2, %a0697 %cmp13 = icmp eq <8 x i32> %shuffle3, %a0698 %cmp15 = icmp eq <8 x i32> %shuffle4, %a0699 %cmp17 = icmp eq <8 x i32> %shuffle5, %a0700 %cmp19 = icmp eq <8 x i32> %shuffle6, %a0701 %or2365 = or <8 x i1> %cmp7, %cmp702 %or2264 = or <8 x i1> %or2365, %cmp9703 %or2567 = or <8 x i1> %or2264, %cmp13704 %or2163 = or <8 x i1> %or2567, %cmp11705 %or62 = or <8 x i1> %or2163, %cmp15706 %or2466 = or <8 x i1> %or62, %cmp17707 %or2668 = or <8 x i1> %or2466, %cmp19708 %or26 = sext <8 x i1> %or2668 to <8 x i32>709 ret <8 x i32> %or26710}711