553 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512dq < %s | FileCheck %s --check-prefix=X86-643; RUN: llc -mtriple=i386-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512dq < %s | FileCheck %s --check-prefix=X86-324 5define void @test_fcmp_storefloat(i1 %cond, ptr %fptr, float %f1, float %f2, float %f3, float %f4, float %f5, float %f6) {6; X86-64-LABEL: test_fcmp_storefloat:7; X86-64: # %bb.0: # %entry8; X86-64-NEXT: testb $1, %dil9; X86-64-NEXT: je .LBB0_210; X86-64-NEXT: # %bb.1: # %if11; X86-64-NEXT: vcmpeqss %xmm3, %xmm2, %k112; X86-64-NEXT: jmp .LBB0_313; X86-64-NEXT: .LBB0_2: # %else14; X86-64-NEXT: vcmpeqss %xmm5, %xmm4, %k115; X86-64-NEXT: .LBB0_3: # %exit16; X86-64-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}17; X86-64-NEXT: vmovss %xmm1, (%rsi)18; X86-64-NEXT: retq19;20; X86-32-LABEL: test_fcmp_storefloat:21; X86-32: # %bb.0: # %entry22; X86-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero23; X86-32-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero24; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax25; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)26; X86-32-NEXT: je .LBB0_227; X86-32-NEXT: # %bb.1: # %if28; X86-32-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero29; X86-32-NEXT: vcmpeqss {{[0-9]+}}(%esp), %xmm2, %k130; X86-32-NEXT: jmp .LBB0_331; X86-32-NEXT: .LBB0_2: # %else32; X86-32-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero33; X86-32-NEXT: vcmpeqss {{[0-9]+}}(%esp), %xmm2, %k134; X86-32-NEXT: .LBB0_3: # %exit35; X86-32-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}36; X86-32-NEXT: vmovss %xmm0, (%eax)37; X86-32-NEXT: retl38entry:39 br i1 %cond, label %if, label %else40 41if:42 %cmp1 = fcmp oeq float %f3, %f443 br label %exit44 45else:46 %cmp2 = fcmp oeq float %f5, %f647 br label %exit48 49exit:50 %val = phi i1 [%cmp1, %if], [%cmp2, %else]51 %selected = select i1 %val, float %f1, float %f252 store float %selected, ptr %fptr53 ret void54}55 56define void @test_fcmp_storei1(i1 %cond, ptr %fptr, ptr %iptr, float %f1, float %f2, float %f3, float %f4) {57; X86-64-LABEL: test_fcmp_storei1:58; X86-64: # %bb.0: # %entry59; X86-64-NEXT: testb $1, %dil60; X86-64-NEXT: je .LBB1_261; X86-64-NEXT: # %bb.1: # %if62; X86-64-NEXT: vcmpeqss %xmm1, %xmm0, %k063; X86-64-NEXT: kmovb %k0, (%rdx)64; X86-64-NEXT: retq65; X86-64-NEXT: .LBB1_2: # %else66; X86-64-NEXT: vcmpeqss %xmm3, %xmm2, %k067; X86-64-NEXT: kmovb %k0, (%rdx)68; X86-64-NEXT: retq69;70; X86-32-LABEL: test_fcmp_storei1:71; X86-32: # %bb.0: # %entry72; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax73; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)74; X86-32-NEXT: je .LBB1_275; X86-32-NEXT: # %bb.1: # %if76; X86-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero77; X86-32-NEXT: vcmpeqss {{[0-9]+}}(%esp), %xmm0, %k078; X86-32-NEXT: kmovb %k0, (%eax)79; X86-32-NEXT: retl80; X86-32-NEXT: .LBB1_2: # %else81; X86-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero82; X86-32-NEXT: vcmpeqss {{[0-9]+}}(%esp), %xmm0, %k083; X86-32-NEXT: kmovb %k0, (%eax)84; X86-32-NEXT: retl85entry:86 br i1 %cond, label %if, label %else87 88if:89 %cmp1 = fcmp oeq float %f1, %f290 br label %exit91 92else:93 %cmp2 = fcmp oeq float %f3, %f494 br label %exit95 96exit:97 %val = phi i1 [%cmp1, %if], [%cmp2, %else]98 store i1 %val, ptr %iptr99 ret void100}101 102define void @test_load_add(i1 %cond, ptr %fptr, ptr %iptr1, ptr %iptr2, float %f1, float %f2) {103; X86-64-LABEL: test_load_add:104; X86-64: # %bb.0: # %entry105; X86-64-NEXT: testb $1, %dil106; X86-64-NEXT: je .LBB2_2107; X86-64-NEXT: # %bb.1: # %if108; X86-64-NEXT: movzbl (%rdx), %eax109; X86-64-NEXT: xorb (%rcx), %al110; X86-64-NEXT: jmp .LBB2_3111; X86-64-NEXT: .LBB2_2: # %else112; X86-64-NEXT: movzbl (%rcx), %eax113; X86-64-NEXT: .LBB2_3: # %exit114; X86-64-NEXT: kmovd %eax, %k1115; X86-64-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}116; X86-64-NEXT: vmovss %xmm1, (%rsi)117; X86-64-NEXT: retq118;119; X86-32-LABEL: test_load_add:120; X86-32: # %bb.0: # %entry121; X86-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero122; X86-32-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero123; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx124; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax125; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)126; X86-32-NEXT: je .LBB2_2127; X86-32-NEXT: # %bb.1: # %if128; X86-32-NEXT: movl {{[0-9]+}}(%esp), %edx129; X86-32-NEXT: movzbl (%edx), %edx130; X86-32-NEXT: xorb (%ecx), %dl131; X86-32-NEXT: jmp .LBB2_3132; X86-32-NEXT: .LBB2_2: # %else133; X86-32-NEXT: movzbl (%ecx), %edx134; X86-32-NEXT: .LBB2_3: # %exit135; X86-32-NEXT: kmovd %edx, %k1136; X86-32-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}137; X86-32-NEXT: vmovss %xmm0, (%eax)138; X86-32-NEXT: retl139entry:140 br i1 %cond, label %if, label %else141 142if:143 %loaded1 = load i1, ptr %iptr1144 %loaded2if = load i1, ptr %iptr2145 %added = add i1 %loaded1, %loaded2if146 br label %exit147 148else:149 %loaded2else = load i1, ptr %iptr2150 br label %exit151 152exit:153 %val = phi i1 [%added, %if], [%loaded2else, %else]154 %selected = select i1 %val, float %f1, float %f2155 store float %selected, ptr %fptr156 ret void157}158 159define void @test_load_i1(i1 %cond, ptr %fptr, ptr %iptr1, ptr %iptr2, float %f1, float %f2) {160; X86-64-LABEL: test_load_i1:161; X86-64: # %bb.0: # %entry162; X86-64-NEXT: testb $1, %dil163; X86-64-NEXT: je .LBB3_2164; X86-64-NEXT: # %bb.1: # %if165; X86-64-NEXT: kmovb (%rdx), %k1166; X86-64-NEXT: jmp .LBB3_3167; X86-64-NEXT: .LBB3_2: # %else168; X86-64-NEXT: kmovb (%rcx), %k1169; X86-64-NEXT: .LBB3_3: # %exit170; X86-64-NEXT: vmovss %xmm0, %xmm1, %xmm1 {%k1}171; X86-64-NEXT: vmovss %xmm1, (%rsi)172; X86-64-NEXT: retq173;174; X86-32-LABEL: test_load_i1:175; X86-32: # %bb.0: # %entry176; X86-32-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero177; X86-32-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero178; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax179; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)180; X86-32-NEXT: je .LBB3_2181; X86-32-NEXT: # %bb.1: # %if182; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx183; X86-32-NEXT: jmp .LBB3_3184; X86-32-NEXT: .LBB3_2: # %else185; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx186; X86-32-NEXT: .LBB3_3: # %exit187; X86-32-NEXT: kmovb (%ecx), %k1188; X86-32-NEXT: vmovss %xmm1, %xmm0, %xmm0 {%k1}189; X86-32-NEXT: vmovss %xmm0, (%eax)190; X86-32-NEXT: retl191entry:192 br i1 %cond, label %if, label %else193 194if:195 %loaded1 = load i1, ptr %iptr1196 br label %exit197 198else:199 %loaded2 = load i1, ptr %iptr2200 br label %exit201 202exit:203 %val = phi i1 [%loaded1, %if], [%loaded2, %else]204 %selected = select i1 %val, float %f1, float %f2205 store float %selected, ptr %fptr206 ret void207}208 209define void @test_loadi1_storei1(i1 %cond, ptr %iptr1, ptr %iptr2, ptr %iptr3) {210; X86-64-LABEL: test_loadi1_storei1:211; X86-64: # %bb.0: # %entry212; X86-64-NEXT: testb $1, %dil213; X86-64-NEXT: je .LBB4_2214; X86-64-NEXT: # %bb.1: # %if215; X86-64-NEXT: movzbl (%rsi), %eax216; X86-64-NEXT: jmp .LBB4_3217; X86-64-NEXT: .LBB4_2: # %else218; X86-64-NEXT: movzbl (%rdx), %eax219; X86-64-NEXT: .LBB4_3: # %exit220; X86-64-NEXT: andb $1, %al221; X86-64-NEXT: movb %al, (%rcx)222; X86-64-NEXT: retq223;224; X86-32-LABEL: test_loadi1_storei1:225; X86-32: # %bb.0: # %entry226; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax227; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)228; X86-32-NEXT: je .LBB4_2229; X86-32-NEXT: # %bb.1: # %if230; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx231; X86-32-NEXT: jmp .LBB4_3232; X86-32-NEXT: .LBB4_2: # %else233; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx234; X86-32-NEXT: .LBB4_3: # %exit235; X86-32-NEXT: movzbl (%ecx), %ecx236; X86-32-NEXT: andb $1, %cl237; X86-32-NEXT: movb %cl, (%eax)238; X86-32-NEXT: retl239entry:240 br i1 %cond, label %if, label %else241 242if:243 %loaded1 = load i1, ptr %iptr1244 br label %exit245 246else:247 %loaded2 = load i1, ptr %iptr2248 br label %exit249 250exit:251 %val = phi i1 [%loaded1, %if], [%loaded2, %else]252 store i1 %val, ptr %iptr3253 ret void254}255 256define void @test_shl1(i1 %cond, ptr %ptr1, ptr %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, ptr %fptrvec) {257; X86-64-LABEL: test_shl1:258; X86-64: # %bb.0: # %entry259; X86-64-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1260; X86-64-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0261; X86-64-NEXT: testb $1, %dil262; X86-64-NEXT: je .LBB5_2263; X86-64-NEXT: # %bb.1: # %if264; X86-64-NEXT: kmovb (%rsi), %k0265; X86-64-NEXT: kaddb %k0, %k0, %k1266; X86-64-NEXT: jmp .LBB5_3267; X86-64-NEXT: .LBB5_2: # %else268; X86-64-NEXT: kmovb (%rdx), %k1269; X86-64-NEXT: .LBB5_3: # %exit270; X86-64-NEXT: vmovaps %zmm0, %zmm1 {%k1}271; X86-64-NEXT: vmovaps %ymm1, (%rcx)272; X86-64-NEXT: vzeroupper273; X86-64-NEXT: retq274;275; X86-32-LABEL: test_shl1:276; X86-32: # %bb.0: # %entry277; X86-32-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1278; X86-32-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0279; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax280; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)281; X86-32-NEXT: je .LBB5_2282; X86-32-NEXT: # %bb.1: # %if283; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx284; X86-32-NEXT: kmovb (%ecx), %k0285; X86-32-NEXT: kaddb %k0, %k0, %k1286; X86-32-NEXT: jmp .LBB5_3287; X86-32-NEXT: .LBB5_2: # %else288; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx289; X86-32-NEXT: kmovb (%ecx), %k1290; X86-32-NEXT: .LBB5_3: # %exit291; X86-32-NEXT: vmovaps %zmm0, %zmm1 {%k1}292; X86-32-NEXT: vmovaps %ymm1, (%eax)293; X86-32-NEXT: vzeroupper294; X86-32-NEXT: retl295entry:296 br i1 %cond, label %if, label %else297 298if:299 %loaded1 = load i8, ptr %ptr1300 %shifted = shl i8 %loaded1, 1301 br label %exit302 303else:304 %loaded2 = load i8, ptr %ptr2305 br label %exit306 307exit:308 %val = phi i8 [%shifted, %if], [%loaded2, %else]309 %mask = bitcast i8 %val to <8 x i1>310 %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2311 store <8 x float> %selected, ptr %fptrvec312 ret void313}314 315define void @test_shr1(i1 %cond, ptr %ptr1, ptr %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, ptr %fptrvec) {316; X86-64-LABEL: test_shr1:317; X86-64: # %bb.0: # %entry318; X86-64-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1319; X86-64-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0320; X86-64-NEXT: testb $1, %dil321; X86-64-NEXT: je .LBB6_2322; X86-64-NEXT: # %bb.1: # %if323; X86-64-NEXT: kmovb (%rsi), %k0324; X86-64-NEXT: kshiftrb $1, %k0, %k1325; X86-64-NEXT: jmp .LBB6_3326; X86-64-NEXT: .LBB6_2: # %else327; X86-64-NEXT: kmovb (%rdx), %k1328; X86-64-NEXT: .LBB6_3: # %exit329; X86-64-NEXT: vmovaps %zmm0, %zmm1 {%k1}330; X86-64-NEXT: vmovaps %ymm1, (%rcx)331; X86-64-NEXT: vzeroupper332; X86-64-NEXT: retq333;334; X86-32-LABEL: test_shr1:335; X86-32: # %bb.0: # %entry336; X86-32-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1337; X86-32-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0338; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax339; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)340; X86-32-NEXT: je .LBB6_2341; X86-32-NEXT: # %bb.1: # %if342; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx343; X86-32-NEXT: kmovb (%ecx), %k0344; X86-32-NEXT: kshiftrb $1, %k0, %k1345; X86-32-NEXT: jmp .LBB6_3346; X86-32-NEXT: .LBB6_2: # %else347; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx348; X86-32-NEXT: kmovb (%ecx), %k1349; X86-32-NEXT: .LBB6_3: # %exit350; X86-32-NEXT: vmovaps %zmm0, %zmm1 {%k1}351; X86-32-NEXT: vmovaps %ymm1, (%eax)352; X86-32-NEXT: vzeroupper353; X86-32-NEXT: retl354entry:355 br i1 %cond, label %if, label %else356 357if:358 %loaded1 = load i8, ptr %ptr1359 %shifted = lshr i8 %loaded1, 1360 br label %exit361 362else:363 %loaded2 = load i8, ptr %ptr2364 br label %exit365 366exit:367 %val = phi i8 [%shifted, %if], [%loaded2, %else]368 %mask = bitcast i8 %val to <8 x i1>369 %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2370 store <8 x float> %selected, ptr %fptrvec371 ret void372}373 374define void @test_shr2(i1 %cond, ptr %ptr1, ptr %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, ptr %fptrvec) {375; X86-64-LABEL: test_shr2:376; X86-64: # %bb.0: # %entry377; X86-64-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1378; X86-64-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0379; X86-64-NEXT: testb $1, %dil380; X86-64-NEXT: je .LBB7_2381; X86-64-NEXT: # %bb.1: # %if382; X86-64-NEXT: kmovb (%rsi), %k0383; X86-64-NEXT: kshiftrb $2, %k0, %k1384; X86-64-NEXT: jmp .LBB7_3385; X86-64-NEXT: .LBB7_2: # %else386; X86-64-NEXT: kmovb (%rdx), %k1387; X86-64-NEXT: .LBB7_3: # %exit388; X86-64-NEXT: vmovaps %zmm0, %zmm1 {%k1}389; X86-64-NEXT: vmovaps %ymm1, (%rcx)390; X86-64-NEXT: vzeroupper391; X86-64-NEXT: retq392;393; X86-32-LABEL: test_shr2:394; X86-32: # %bb.0: # %entry395; X86-32-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1396; X86-32-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0397; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax398; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)399; X86-32-NEXT: je .LBB7_2400; X86-32-NEXT: # %bb.1: # %if401; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx402; X86-32-NEXT: kmovb (%ecx), %k0403; X86-32-NEXT: kshiftrb $2, %k0, %k1404; X86-32-NEXT: jmp .LBB7_3405; X86-32-NEXT: .LBB7_2: # %else406; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx407; X86-32-NEXT: kmovb (%ecx), %k1408; X86-32-NEXT: .LBB7_3: # %exit409; X86-32-NEXT: vmovaps %zmm0, %zmm1 {%k1}410; X86-32-NEXT: vmovaps %ymm1, (%eax)411; X86-32-NEXT: vzeroupper412; X86-32-NEXT: retl413entry:414 br i1 %cond, label %if, label %else415 416if:417 %loaded1 = load i8, ptr %ptr1418 %shifted = lshr i8 %loaded1, 2419 br label %exit420 421else:422 %loaded2 = load i8, ptr %ptr2423 br label %exit424 425exit:426 %val = phi i8 [%shifted, %if], [%loaded2, %else]427 %mask = bitcast i8 %val to <8 x i1>428 %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2429 store <8 x float> %selected, ptr %fptrvec430 ret void431}432 433define void @test_shl(i1 %cond, ptr %ptr1, ptr %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, ptr %fptrvec) {434; X86-64-LABEL: test_shl:435; X86-64: # %bb.0: # %entry436; X86-64-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1437; X86-64-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0438; X86-64-NEXT: testb $1, %dil439; X86-64-NEXT: je .LBB8_2440; X86-64-NEXT: # %bb.1: # %if441; X86-64-NEXT: kmovb (%rsi), %k0442; X86-64-NEXT: kshiftlb $6, %k0, %k1443; X86-64-NEXT: jmp .LBB8_3444; X86-64-NEXT: .LBB8_2: # %else445; X86-64-NEXT: kmovb (%rdx), %k1446; X86-64-NEXT: .LBB8_3: # %exit447; X86-64-NEXT: vmovaps %zmm0, %zmm1 {%k1}448; X86-64-NEXT: vmovaps %ymm1, (%rcx)449; X86-64-NEXT: vzeroupper450; X86-64-NEXT: retq451;452; X86-32-LABEL: test_shl:453; X86-32: # %bb.0: # %entry454; X86-32-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1455; X86-32-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0456; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax457; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)458; X86-32-NEXT: je .LBB8_2459; X86-32-NEXT: # %bb.1: # %if460; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx461; X86-32-NEXT: kmovb (%ecx), %k0462; X86-32-NEXT: kshiftlb $6, %k0, %k1463; X86-32-NEXT: jmp .LBB8_3464; X86-32-NEXT: .LBB8_2: # %else465; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx466; X86-32-NEXT: kmovb (%ecx), %k1467; X86-32-NEXT: .LBB8_3: # %exit468; X86-32-NEXT: vmovaps %zmm0, %zmm1 {%k1}469; X86-32-NEXT: vmovaps %ymm1, (%eax)470; X86-32-NEXT: vzeroupper471; X86-32-NEXT: retl472entry:473 br i1 %cond, label %if, label %else474 475if:476 %loaded1 = load i8, ptr %ptr1477 %shifted = shl i8 %loaded1, 6478 br label %exit479 480else:481 %loaded2 = load i8, ptr %ptr2482 br label %exit483 484exit:485 %val = phi i8 [%shifted, %if], [%loaded2, %else]486 %mask = bitcast i8 %val to <8 x i1>487 %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2488 store <8 x float> %selected, ptr %fptrvec489 ret void490}491 492define void @test_add(i1 %cond, ptr %ptr1, ptr %ptr2, <8 x float> %fvec1, <8 x float> %fvec2, ptr %fptrvec) {493; X86-64-LABEL: test_add:494; X86-64: # %bb.0: # %entry495; X86-64-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1496; X86-64-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0497; X86-64-NEXT: kmovb (%rsi), %k0498; X86-64-NEXT: kmovb (%rdx), %k1499; X86-64-NEXT: testb $1, %dil500; X86-64-NEXT: je .LBB9_2501; X86-64-NEXT: # %bb.1: # %if502; X86-64-NEXT: kandb %k1, %k0, %k1503; X86-64-NEXT: jmp .LBB9_3504; X86-64-NEXT: .LBB9_2: # %else505; X86-64-NEXT: kaddb %k1, %k0, %k1506; X86-64-NEXT: .LBB9_3: # %exit507; X86-64-NEXT: vmovaps %zmm0, %zmm1 {%k1}508; X86-64-NEXT: vmovaps %ymm1, (%rcx)509; X86-64-NEXT: vzeroupper510; X86-64-NEXT: retq511;512; X86-32-LABEL: test_add:513; X86-32: # %bb.0: # %entry514; X86-32-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1515; X86-32-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0516; X86-32-NEXT: movl {{[0-9]+}}(%esp), %eax517; X86-32-NEXT: movl {{[0-9]+}}(%esp), %ecx518; X86-32-NEXT: movl {{[0-9]+}}(%esp), %edx519; X86-32-NEXT: kmovb (%edx), %k0520; X86-32-NEXT: kmovb (%ecx), %k1521; X86-32-NEXT: testb $1, {{[0-9]+}}(%esp)522; X86-32-NEXT: je .LBB9_2523; X86-32-NEXT: # %bb.1: # %if524; X86-32-NEXT: kandb %k1, %k0, %k1525; X86-32-NEXT: jmp .LBB9_3526; X86-32-NEXT: .LBB9_2: # %else527; X86-32-NEXT: kaddb %k1, %k0, %k1528; X86-32-NEXT: .LBB9_3: # %exit529; X86-32-NEXT: vmovaps %zmm0, %zmm1 {%k1}530; X86-32-NEXT: vmovaps %ymm1, (%eax)531; X86-32-NEXT: vzeroupper532; X86-32-NEXT: retl533entry:534 %loaded1 = load i8, ptr %ptr1535 %loaded2 = load i8, ptr %ptr2536 br i1 %cond, label %if, label %else537 538if:539 %and = and i8 %loaded1, %loaded2540 br label %exit541 542else:543 %add = add i8 %loaded1, %loaded2544 br label %exit545 546exit:547 %val = phi i8 [%and, %if], [%add, %else]548 %mask = bitcast i8 %val to <8 x i1>549 %selected = select <8 x i1> %mask, <8 x float> %fvec1, <8 x float> %fvec2550 store <8 x float> %selected, ptr %fptrvec551 ret void552}553