; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=CHECK,SSE ; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK,AVX2 ; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=CHECK,AVX512 ; ; PR58895 - replace shuffled _mm_blendv_epi8+icmp with select+icmp ; ; ; 256-bits types split to use 128-bit PBLENDVB selects ; define <4 x double> @x86_pblendvb_v4f64_v2f64(<4 x double> %a, <4 x double> %b, <4 x double> %c, <4 x double> %d) { ; CHECK-LABEL: @x86_pblendvb_v4f64_v2f64( ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x double> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[DOTV:%.*]] = select <4 x i1> [[CMP]], <4 x double> [[B:%.*]], <4 x double> [[A:%.*]] ; CHECK-NEXT: ret <4 x double> [[DOTV]] ; %a.bc = bitcast <4 x double> %a to <32 x i8> %b.bc = bitcast <4 x double> %b to <32 x i8> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = fcmp olt <4 x double> %c, %d %sext = sext <4 x i1> %cmp to <4 x i64> %sext.bc = bitcast <4 x i64> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <4 x double> ret <4 x double> %res } define <8 x float> @x86_pblendvb_v8f32_v4f32(<8 x float> %a, <8 x float> %b, <8 x float> %c, <8 x float> %d) { ; CHECK-LABEL: @x86_pblendvb_v8f32_v4f32( ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <8 x float> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[DOTV:%.*]] = select <8 x i1> [[CMP]], <8 x float> [[B:%.*]], <8 x float> [[A:%.*]] ; CHECK-NEXT: ret <8 x float> [[DOTV]] ; %a.bc = bitcast <8 x float> %a to <32 x i8> %b.bc = bitcast <8 x float> %b to <32 x i8> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = fcmp olt <8 x float> %c, %d %sext = sext <8 x i1> %cmp to <8 x i32> %sext.bc = bitcast <8 x i32> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <8 x float> ret <8 x float> %res } define <4 x i64> @x86_pblendvb_v4i64_v2i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v4i64_v2i64( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <4 x i64> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> [[CMP]], <4 x i64> [[B:%.*]], <4 x i64> [[A:%.*]] ; CHECK-NEXT: ret <4 x i64> [[TMP1]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <4 x i64> %c, %d %sext = sext <4 x i1> %cmp to <4 x i64> %sext.bc = bitcast <4 x i64> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <4 x i64> ret <4 x i64> %res } define <4 x i64> @x86_pblendvb_v8i32_v4i32(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; SSE-LABEL: @x86_pblendvb_v8i32_v4i32( ; SSE-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <8 x i32> ; SSE-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <8 x i32> ; SSE-NEXT: [[CMP:%.*]] = icmp slt <8 x i32> [[C_BC]], [[D_BC]] ; SSE-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[A:%.*]] to <8 x i32> ; SSE-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <8 x i32> ; SSE-NEXT: [[TMP3:%.*]] = select <8 x i1> [[CMP]], <8 x i32> [[TMP2]], <8 x i32> [[TMP1]] ; SSE-NEXT: [[RES:%.*]] = bitcast <8 x i32> [[TMP3]] to <4 x i64> ; SSE-NEXT: ret <4 x i64> [[RES]] ; ; AVX2-LABEL: @x86_pblendvb_v8i32_v4i32( ; AVX2-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <8 x i32> ; AVX2-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <8 x i32> ; AVX2-NEXT: [[TMP1:%.*]] = icmp slt <8 x i32> [[C_BC]], [[D_BC]] ; AVX2-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <8 x i32> ; AVX2-NEXT: [[TMP3:%.*]] = bitcast <4 x i64> [[A:%.*]] to <8 x i32> ; AVX2-NEXT: [[TMP4:%.*]] = select <8 x i1> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> [[TMP3]] ; AVX2-NEXT: [[RES:%.*]] = bitcast <8 x i32> [[TMP4]] to <4 x i64> ; AVX2-NEXT: ret <4 x i64> [[RES]] ; ; AVX512-LABEL: @x86_pblendvb_v8i32_v4i32( ; AVX512-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <8 x i32> ; AVX512-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <8 x i32> ; AVX512-NEXT: [[CMP:%.*]] = icmp slt <8 x i32> [[C_BC]], [[D_BC]] ; AVX512-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[A:%.*]] to <8 x i32> ; AVX512-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <8 x i32> ; AVX512-NEXT: [[TMP3:%.*]] = select <8 x i1> [[CMP]], <8 x i32> [[TMP2]], <8 x i32> [[TMP1]] ; AVX512-NEXT: [[RES:%.*]] = bitcast <8 x i32> [[TMP3]] to <4 x i64> ; AVX512-NEXT: ret <4 x i64> [[RES]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %c.bc = bitcast <4 x i64> %c to <8 x i32> %d.bc = bitcast <4 x i64> %d to <8 x i32> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <8 x i32> %c.bc, %d.bc %sext = sext <8 x i1> %cmp to <8 x i32> %sext.bc = bitcast <8 x i32> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <4 x i64> ret <4 x i64> %res } define <4 x i64> @x86_pblendvb_v16i16_v8i16(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; SSE-LABEL: @x86_pblendvb_v16i16_v8i16( ; SSE-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <16 x i16> ; SSE-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <16 x i16> ; SSE-NEXT: [[CMP:%.*]] = icmp slt <16 x i16> [[C_BC]], [[D_BC]] ; SSE-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[A:%.*]] to <16 x i16> ; SSE-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <16 x i16> ; SSE-NEXT: [[TMP3:%.*]] = select <16 x i1> [[CMP]], <16 x i16> [[TMP2]], <16 x i16> [[TMP1]] ; SSE-NEXT: [[RES:%.*]] = bitcast <16 x i16> [[TMP3]] to <4 x i64> ; SSE-NEXT: ret <4 x i64> [[RES]] ; ; AVX2-LABEL: @x86_pblendvb_v16i16_v8i16( ; AVX2-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <16 x i16> ; AVX2-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <16 x i16> ; AVX2-NEXT: [[TMP1:%.*]] = icmp slt <16 x i16> [[C_BC]], [[D_BC]] ; AVX2-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <16 x i16> ; AVX2-NEXT: [[TMP3:%.*]] = bitcast <4 x i64> [[A:%.*]] to <16 x i16> ; AVX2-NEXT: [[TMP4:%.*]] = select <16 x i1> [[TMP1]], <16 x i16> [[TMP2]], <16 x i16> [[TMP3]] ; AVX2-NEXT: [[RES:%.*]] = bitcast <16 x i16> [[TMP4]] to <4 x i64> ; AVX2-NEXT: ret <4 x i64> [[RES]] ; ; AVX512-LABEL: @x86_pblendvb_v16i16_v8i16( ; AVX512-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <16 x i16> ; AVX512-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <16 x i16> ; AVX512-NEXT: [[CMP:%.*]] = icmp slt <16 x i16> [[C_BC]], [[D_BC]] ; AVX512-NEXT: [[TMP1:%.*]] = bitcast <4 x i64> [[A:%.*]] to <16 x i16> ; AVX512-NEXT: [[TMP2:%.*]] = bitcast <4 x i64> [[B:%.*]] to <16 x i16> ; AVX512-NEXT: [[TMP3:%.*]] = select <16 x i1> [[CMP]], <16 x i16> [[TMP2]], <16 x i16> [[TMP1]] ; AVX512-NEXT: [[RES:%.*]] = bitcast <16 x i16> [[TMP3]] to <4 x i64> ; AVX512-NEXT: ret <4 x i64> [[RES]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %c.bc = bitcast <4 x i64> %c to <16 x i16> %d.bc = bitcast <4 x i64> %d to <16 x i16> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <16 x i16> %c.bc, %d.bc %sext = sext <16 x i1> %cmp to <16 x i16> %sext.bc = bitcast <16 x i16> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <4 x i64> ret <4 x i64> %res } define <4 x i64> @x86_pblendvb_v32i8_v16i8(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v32i8_v16i8( ; CHECK-NEXT: [[A_BC:%.*]] = bitcast <4 x i64> [[A:%.*]] to <32 x i8> ; CHECK-NEXT: [[B_BC:%.*]] = bitcast <4 x i64> [[B:%.*]] to <32 x i8> ; CHECK-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <32 x i8> ; CHECK-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <32 x i8> ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <32 x i8> [[C_BC]], [[D_BC]] ; CHECK-NEXT: [[CONCAT:%.*]] = select <32 x i1> [[CMP]], <32 x i8> [[B_BC]], <32 x i8> [[A_BC]] ; CHECK-NEXT: [[RES:%.*]] = bitcast <32 x i8> [[CONCAT]] to <4 x i64> ; CHECK-NEXT: ret <4 x i64> [[RES]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %c.bc = bitcast <4 x i64> %c to <32 x i8> %d.bc = bitcast <4 x i64> %d to <32 x i8> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %a.hi = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.hi = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <32 x i8> %c.bc, %d.bc %sext = sext <32 x i1> %cmp to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext, <32 x i8> poison, <16 x i32> %sext.hi = shufflevector <32 x i8> %sext, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %sel.hi = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.hi, <16 x i8> %b.hi, <16 x i8> %sext.hi) %concat = shufflevector <16 x i8> %sel.lo, <16 x i8> %sel.hi, <32 x i32> %res = bitcast <32 x i8> %concat to <4 x i64> ret <4 x i64> %res } ; ; 512-bits types split to use 256-bit PBLENDVB selects ; define <8 x double> @x86_pblendvb_v8f64_v4f64(<8 x double> %a, <8 x double> %b, <8 x double> %c, <8 x double> %d) { ; CHECK-LABEL: @x86_pblendvb_v8f64_v4f64( ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <8 x double> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[DOTV:%.*]] = select <8 x i1> [[CMP]], <8 x double> [[B:%.*]], <8 x double> [[A:%.*]] ; CHECK-NEXT: ret <8 x double> [[DOTV]] ; %a.bc = bitcast <8 x double> %a to <64 x i8> %b.bc = bitcast <8 x double> %b to <64 x i8> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = fcmp olt <8 x double> %c, %d %sext = sext <8 x i1> %cmp to <8 x i64> %sext.bc = bitcast <8 x i64> %sext to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <8 x double> ret <8 x double> %res } define <16 x float> @x86_pblendvb_v16f32_v8f32(<16 x float> %a, <16 x float> %b, <16 x float> %c, <16 x float> %d) { ; CHECK-LABEL: @x86_pblendvb_v16f32_v8f32( ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <16 x float> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[DOTV:%.*]] = select <16 x i1> [[CMP]], <16 x float> [[B:%.*]], <16 x float> [[A:%.*]] ; CHECK-NEXT: ret <16 x float> [[DOTV]] ; %a.bc = bitcast <16 x float> %a to <64 x i8> %b.bc = bitcast <16 x float> %b to <64 x i8> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = fcmp olt <16 x float> %c, %d %sext = sext <16 x i1> %cmp to <16 x i32> %sext.bc = bitcast <16 x i32> %sext to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <16 x float> ret <16 x float> %res } define <8 x i64> @x86_pblendvb_v8i64_v4i64(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v8i64_v4i64( ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <8 x i64> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[TMP1:%.*]] = select <8 x i1> [[CMP]], <8 x i64> [[B:%.*]], <8 x i64> [[A:%.*]] ; CHECK-NEXT: ret <8 x i64> [[TMP1]] ; %a.bc = bitcast <8 x i64> %a to <64 x i8> %b.bc = bitcast <8 x i64> %b to <64 x i8> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = icmp slt <8 x i64> %c, %d %sext = sext <8 x i1> %cmp to <8 x i64> %sext.bc = bitcast <8 x i64> %sext to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <8 x i64> ret <8 x i64> %res } define <8 x i64> @x86_pblendvb_v16i32_v8i32(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v16i32_v8i32( ; CHECK-NEXT: [[C_BC:%.*]] = bitcast <8 x i64> [[C:%.*]] to <16 x i32> ; CHECK-NEXT: [[D_BC:%.*]] = bitcast <8 x i64> [[D:%.*]] to <16 x i32> ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <16 x i32> [[C_BC]], [[D_BC]] ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[A:%.*]] to <16 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[B:%.*]] to <16 x i32> ; CHECK-NEXT: [[TMP3:%.*]] = select <16 x i1> [[CMP]], <16 x i32> [[TMP2]], <16 x i32> [[TMP1]] ; CHECK-NEXT: [[RES:%.*]] = bitcast <16 x i32> [[TMP3]] to <8 x i64> ; CHECK-NEXT: ret <8 x i64> [[RES]] ; %a.bc = bitcast <8 x i64> %a to <64 x i8> %b.bc = bitcast <8 x i64> %b to <64 x i8> %c.bc = bitcast <8 x i64> %c to <16 x i32> %d.bc = bitcast <8 x i64> %d to <16 x i32> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = icmp slt <16 x i32> %c.bc, %d.bc %sext = sext <16 x i1> %cmp to <16 x i32> %sext.bc = bitcast <16 x i32> %sext to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <8 x i64> ret <8 x i64> %res } define <8 x i64> @x86_pblendvb_v32i16_v16i16(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) { ; SSE-LABEL: @x86_pblendvb_v32i16_v16i16( ; SSE-NEXT: [[C_BC:%.*]] = bitcast <8 x i64> [[C:%.*]] to <32 x i16> ; SSE-NEXT: [[D_BC:%.*]] = bitcast <8 x i64> [[D:%.*]] to <32 x i16> ; SSE-NEXT: [[TMP1:%.*]] = icmp slt <32 x i16> [[C_BC]], [[D_BC]] ; SSE-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[B:%.*]] to <32 x i16> ; SSE-NEXT: [[TMP3:%.*]] = bitcast <8 x i64> [[A:%.*]] to <32 x i16> ; SSE-NEXT: [[TMP4:%.*]] = select <32 x i1> [[TMP1]], <32 x i16> [[TMP2]], <32 x i16> [[TMP3]] ; SSE-NEXT: [[RES:%.*]] = bitcast <32 x i16> [[TMP4]] to <8 x i64> ; SSE-NEXT: ret <8 x i64> [[RES]] ; ; AVX2-LABEL: @x86_pblendvb_v32i16_v16i16( ; AVX2-NEXT: [[C_BC:%.*]] = bitcast <8 x i64> [[C:%.*]] to <32 x i16> ; AVX2-NEXT: [[D_BC:%.*]] = bitcast <8 x i64> [[D:%.*]] to <32 x i16> ; AVX2-NEXT: [[CMP:%.*]] = icmp slt <32 x i16> [[C_BC]], [[D_BC]] ; AVX2-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[A:%.*]] to <32 x i16> ; AVX2-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[B:%.*]] to <32 x i16> ; AVX2-NEXT: [[TMP3:%.*]] = select <32 x i1> [[CMP]], <32 x i16> [[TMP2]], <32 x i16> [[TMP1]] ; AVX2-NEXT: [[RES:%.*]] = bitcast <32 x i16> [[TMP3]] to <8 x i64> ; AVX2-NEXT: ret <8 x i64> [[RES]] ; ; AVX512-LABEL: @x86_pblendvb_v32i16_v16i16( ; AVX512-NEXT: [[C_BC:%.*]] = bitcast <8 x i64> [[C:%.*]] to <32 x i16> ; AVX512-NEXT: [[D_BC:%.*]] = bitcast <8 x i64> [[D:%.*]] to <32 x i16> ; AVX512-NEXT: [[CMP:%.*]] = icmp slt <32 x i16> [[C_BC]], [[D_BC]] ; AVX512-NEXT: [[TMP1:%.*]] = bitcast <8 x i64> [[A:%.*]] to <32 x i16> ; AVX512-NEXT: [[TMP2:%.*]] = bitcast <8 x i64> [[B:%.*]] to <32 x i16> ; AVX512-NEXT: [[TMP3:%.*]] = select <32 x i1> [[CMP]], <32 x i16> [[TMP2]], <32 x i16> [[TMP1]] ; AVX512-NEXT: [[RES:%.*]] = bitcast <32 x i16> [[TMP3]] to <8 x i64> ; AVX512-NEXT: ret <8 x i64> [[RES]] ; %a.bc = bitcast <8 x i64> %a to <64 x i8> %b.bc = bitcast <8 x i64> %b to <64 x i8> %c.bc = bitcast <8 x i64> %c to <32 x i16> %d.bc = bitcast <8 x i64> %d to <32 x i16> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = icmp slt <32 x i16> %c.bc, %d.bc %sext = sext <32 x i1> %cmp to <32 x i16> %sext.bc = bitcast <32 x i16> %sext to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext.bc, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <8 x i64> ret <8 x i64> %res } define <8 x i64> @x86_pblendvb_v64i8_v32i8(<8 x i64> %a, <8 x i64> %b, <8 x i64> %c, <8 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v64i8_v32i8( ; CHECK-NEXT: [[A_BC:%.*]] = bitcast <8 x i64> [[A:%.*]] to <64 x i8> ; CHECK-NEXT: [[B_BC:%.*]] = bitcast <8 x i64> [[B:%.*]] to <64 x i8> ; CHECK-NEXT: [[C_BC:%.*]] = bitcast <8 x i64> [[C:%.*]] to <64 x i8> ; CHECK-NEXT: [[D_BC:%.*]] = bitcast <8 x i64> [[D:%.*]] to <64 x i8> ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <64 x i8> [[C_BC]], [[D_BC]] ; CHECK-NEXT: [[CONCAT:%.*]] = select <64 x i1> [[CMP]], <64 x i8> [[B_BC]], <64 x i8> [[A_BC]] ; CHECK-NEXT: [[RES:%.*]] = bitcast <64 x i8> [[CONCAT]] to <8 x i64> ; CHECK-NEXT: ret <8 x i64> [[RES]] ; %a.bc = bitcast <8 x i64> %a to <64 x i8> %b.bc = bitcast <8 x i64> %b to <64 x i8> %c.bc = bitcast <8 x i64> %c to <64 x i8> %d.bc = bitcast <8 x i64> %d to <64 x i8> %a.lo = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.lo = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %a.hi = shufflevector <64 x i8> %a.bc, <64 x i8> poison, <32 x i32> %b.hi = shufflevector <64 x i8> %b.bc, <64 x i8> poison, <32 x i32> %cmp = icmp slt <64 x i8> %c.bc, %d.bc %sext = sext <64 x i1> %cmp to <64 x i8> %sext.lo = shufflevector <64 x i8> %sext, <64 x i8> poison, <32 x i32> %sext.hi = shufflevector <64 x i8> %sext, <64 x i8> poison, <32 x i32> %sel.lo = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.lo, <32 x i8> %b.lo, <32 x i8> %sext.lo) %sel.hi = tail call <32 x i8> @llvm.x86.avx2.pblendvb(<32 x i8> %a.hi, <32 x i8> %b.hi, <32 x i8> %sext.hi) %concat = shufflevector <32 x i8> %sel.lo, <32 x i8> %sel.hi, <64 x i32> %res = bitcast <64 x i8> %concat to <8 x i64> ret <8 x i64> %res } define <2 x i64> @PR66513(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, <2 x i64> %src) { ; CHECK-LABEL: @PR66513( ; CHECK-NEXT: [[I:%.*]] = bitcast <2 x i64> [[A:%.*]] to <4 x i32> ; CHECK-NEXT: [[CMP_I23:%.*]] = icmp sgt <4 x i32> [[I]], zeroinitializer ; CHECK-NEXT: [[I2:%.*]] = bitcast <2 x i64> [[B:%.*]] to <4 x i32> ; CHECK-NEXT: [[CMP_I21:%.*]] = icmp sgt <4 x i32> [[I2]], zeroinitializer ; CHECK-NEXT: [[I4:%.*]] = bitcast <2 x i64> [[C:%.*]] to <4 x i32> ; CHECK-NEXT: [[CMP_I:%.*]] = icmp sgt <4 x i32> [[I4]], zeroinitializer ; CHECK-NEXT: [[NARROW:%.*]] = select <4 x i1> [[CMP_I21]], <4 x i1> [[CMP_I23]], <4 x i1> zeroinitializer ; CHECK-NEXT: [[XOR_I_INNER1:%.*]] = xor <4 x i1> [[NARROW]], [[CMP_I]] ; CHECK-NEXT: [[NARROW3:%.*]] = select <4 x i1> [[CMP_I23]], <4 x i1> [[XOR_I_INNER1]], <4 x i1> zeroinitializer ; CHECK-NEXT: [[AND_I25_INNER2:%.*]] = and <4 x i1> [[XOR_I_INNER1]], [[CMP_I21]] ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[SRC:%.*]] to <4 x i32> ; CHECK-NEXT: [[TMP2:%.*]] = select <4 x i1> [[NARROW]], <4 x i32> [[TMP1]], <4 x i32> zeroinitializer ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[A]] to <4 x i32> ; CHECK-NEXT: [[TMP4:%.*]] = select <4 x i1> [[NARROW3]], <4 x i32> [[TMP3]], <4 x i32> [[TMP2]] ; CHECK-NEXT: [[TMP5:%.*]] = bitcast <2 x i64> [[B]] to <4 x i32> ; CHECK-NEXT: [[SEXT_I:%.*]] = select <4 x i1> [[AND_I25_INNER2]], <4 x i32> [[TMP5]], <4 x i32> [[TMP4]] ; CHECK-NEXT: [[I5:%.*]] = bitcast <4 x i32> [[SEXT_I]] to <2 x i64> ; CHECK-NEXT: ret <2 x i64> [[I5]] ; %i = bitcast <2 x i64> %a to <4 x i32> %cmp.i23 = icmp sgt <4 x i32> %i, zeroinitializer %sext.i24 = sext <4 x i1> %cmp.i23 to <4 x i32> %i1 = bitcast <4 x i32> %sext.i24 to <2 x i64> %i2 = bitcast <2 x i64> %b to <4 x i32> %cmp.i21 = icmp sgt <4 x i32> %i2, zeroinitializer %sext.i22 = sext <4 x i1> %cmp.i21 to <4 x i32> %i3 = bitcast <4 x i32> %sext.i22 to <2 x i64> %i4 = bitcast <2 x i64> %c to <4 x i32> %cmp.i = icmp sgt <4 x i32> %i4, zeroinitializer %sext.i = sext <4 x i1> %cmp.i to <4 x i32> %i5 = bitcast <4 x i32> %sext.i to <2 x i64> %and.i27 = and <2 x i64> %i1, %i3 %xor.i = xor <2 x i64> %and.i27, %i5 %and.i26 = and <2 x i64> %xor.i, %i1 %and.i25 = and <2 x i64> %xor.i, %i3 %and.i = and <2 x i64> %src, %and.i27 %i6 = bitcast <2 x i64> %and.i to <16 x i8> %i7 = bitcast <2 x i64> %a to <16 x i8> %i8 = bitcast <2 x i64> %and.i26 to <16 x i8> %i9 = call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %i6, <16 x i8> %i7, <16 x i8> %i8) %i10 = bitcast <16 x i8> %i9 to <2 x i64> %i11 = bitcast <2 x i64> %i10 to <16 x i8> %i12 = bitcast <2 x i64> %b to <16 x i8> %i13 = bitcast <2 x i64> %and.i25 to <16 x i8> %i14 = call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %i11, <16 x i8> %i12, <16 x i8> %i13) %i15 = bitcast <16 x i8> %i14 to <2 x i64> ret <2 x i64> %i15 } ; ; Negative Tests ; ; non-pow2 source define <2 x double> @x86_pblendvb_v3f64_v2f64(<3 x double> %a, <3 x double> %b, <3 x double> %c, <3 x double> %d) { ; CHECK-LABEL: @x86_pblendvb_v3f64_v2f64( ; CHECK-NEXT: [[A_BC:%.*]] = bitcast <3 x double> [[A:%.*]] to <24 x i8> ; CHECK-NEXT: [[B_BC:%.*]] = bitcast <3 x double> [[B:%.*]] to <24 x i8> ; CHECK-NEXT: [[A_LO:%.*]] = shufflevector <24 x i8> [[A_BC]], <24 x i8> poison, <16 x i32> ; CHECK-NEXT: [[B_LO:%.*]] = shufflevector <24 x i8> [[B_BC]], <24 x i8> poison, <16 x i32> ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt <3 x double> [[C:%.*]], [[D:%.*]] ; CHECK-NEXT: [[SEXT:%.*]] = sext <3 x i1> [[CMP]] to <3 x i64> ; CHECK-NEXT: [[SEXT_BC:%.*]] = bitcast <3 x i64> [[SEXT]] to <24 x i8> ; CHECK-NEXT: [[SEXT_LO:%.*]] = shufflevector <24 x i8> [[SEXT_BC]], <24 x i8> poison, <16 x i32> ; CHECK-NEXT: [[SEL_LO:%.*]] = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> [[A_LO]], <16 x i8> [[B_LO]], <16 x i8> [[SEXT_LO]]) ; CHECK-NEXT: [[RES:%.*]] = bitcast <16 x i8> [[SEL_LO]] to <2 x double> ; CHECK-NEXT: ret <2 x double> [[RES]] ; %a.bc = bitcast <3 x double> %a to <24 x i8> %b.bc = bitcast <3 x double> %b to <24 x i8> %a.lo = shufflevector <24 x i8> %a.bc, <24 x i8> poison, <16 x i32> %b.lo = shufflevector <24 x i8> %b.bc, <24 x i8> poison, <16 x i32> %cmp = fcmp olt <3 x double> %c, %d %sext = sext <3 x i1> %cmp to <3 x i64> %sext.bc = bitcast <3 x i64> %sext to <24 x i8> %sext.lo = shufflevector <24 x i8> %sext.bc, <24 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %res = bitcast <16 x i8> %sel.lo to <2 x double> ret <2 x double> %res } ; shuffle masks contain undef define <2 x i64> @x86_pblendvb_v32i8_v16i8_undefs(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v32i8_v16i8_undefs( ; CHECK-NEXT: [[A_BC:%.*]] = bitcast <4 x i64> [[A:%.*]] to <32 x i8> ; CHECK-NEXT: [[B_BC:%.*]] = bitcast <4 x i64> [[B:%.*]] to <32 x i8> ; CHECK-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <32 x i8> ; CHECK-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <32 x i8> ; CHECK-NEXT: [[A_LO:%.*]] = shufflevector <32 x i8> [[A_BC]], <32 x i8> poison, <16 x i32> ; CHECK-NEXT: [[B_LO:%.*]] = shufflevector <32 x i8> [[B_BC]], <32 x i8> poison, <16 x i32> ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <32 x i8> [[C_BC]], [[D_BC]] ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <32 x i1> [[CMP]], <32 x i1> poison, <16 x i32> ; CHECK-NEXT: [[SEL_LO:%.*]] = select <16 x i1> [[TMP1]], <16 x i8> [[B_LO]], <16 x i8> [[A_LO]] ; CHECK-NEXT: [[RES:%.*]] = bitcast <16 x i8> [[SEL_LO]] to <2 x i64> ; CHECK-NEXT: ret <2 x i64> [[RES]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %c.bc = bitcast <4 x i64> %c to <32 x i8> %d.bc = bitcast <4 x i64> %d to <32 x i8> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <32 x i8> %c.bc, %d.bc %sext = sext <32 x i1> %cmp to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %res = bitcast <16 x i8> %sel.lo to <2 x i64> ret <2 x i64> %res } ; masks elements too small define <2 x i64> @x86_pblendvb_v32i8_v32i4(<4 x i64> %a, <4 x i64> %b, <4 x i64> %c, <4 x i64> %d) { ; CHECK-LABEL: @x86_pblendvb_v32i8_v32i4( ; CHECK-NEXT: [[A_BC:%.*]] = bitcast <4 x i64> [[A:%.*]] to <32 x i8> ; CHECK-NEXT: [[B_BC:%.*]] = bitcast <4 x i64> [[B:%.*]] to <32 x i8> ; CHECK-NEXT: [[C_BC:%.*]] = bitcast <4 x i64> [[C:%.*]] to <64 x i4> ; CHECK-NEXT: [[D_BC:%.*]] = bitcast <4 x i64> [[D:%.*]] to <64 x i4> ; CHECK-NEXT: [[A_LO:%.*]] = shufflevector <32 x i8> [[A_BC]], <32 x i8> poison, <16 x i32> ; CHECK-NEXT: [[B_LO:%.*]] = shufflevector <32 x i8> [[B_BC]], <32 x i8> poison, <16 x i32> ; CHECK-NEXT: [[CMP:%.*]] = icmp slt <64 x i4> [[C_BC]], [[D_BC]] ; CHECK-NEXT: [[SEXT:%.*]] = sext <64 x i1> [[CMP]] to <64 x i4> ; CHECK-NEXT: [[SEXT_BC:%.*]] = bitcast <64 x i4> [[SEXT]] to <32 x i8> ; CHECK-NEXT: [[SEXT_LO:%.*]] = shufflevector <32 x i8> [[SEXT_BC]], <32 x i8> poison, <16 x i32> ; CHECK-NEXT: [[SEL_LO:%.*]] = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> [[A_LO]], <16 x i8> [[B_LO]], <16 x i8> [[SEXT_LO]]) ; CHECK-NEXT: [[RES:%.*]] = bitcast <16 x i8> [[SEL_LO]] to <2 x i64> ; CHECK-NEXT: ret <2 x i64> [[RES]] ; %a.bc = bitcast <4 x i64> %a to <32 x i8> %b.bc = bitcast <4 x i64> %b to <32 x i8> %c.bc = bitcast <4 x i64> %c to <64 x i4> %d.bc = bitcast <4 x i64> %d to <64 x i4> %a.lo = shufflevector <32 x i8> %a.bc, <32 x i8> poison, <16 x i32> %b.lo = shufflevector <32 x i8> %b.bc, <32 x i8> poison, <16 x i32> %cmp = icmp slt <64 x i4> %c.bc, %d.bc %sext = sext <64 x i1> %cmp to <64 x i4> %sext.bc = bitcast <64 x i4> %sext to <32 x i8> %sext.lo = shufflevector <32 x i8> %sext.bc, <32 x i8> poison, <16 x i32> %sel.lo = tail call <16 x i8> @llvm.x86.sse41.pblendvb(<16 x i8> %a.lo, <16 x i8> %b.lo, <16 x i8> %sext.lo) %res = bitcast <16 x i8> %sel.lo to <2 x i64> ret <2 x i64> %res }