; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -passes=sandbox-vectorizer -sbvec-vec-reg-bits=1024 -sbvec-allow-non-pow2 -sbvec-passes="seed-collection" %s -S | FileCheck %s ; This file includes tests for opcodes that need special checks. ; TODO: Selects with conditions of diff number of lanes than the instruction itself need special treatment. define void @selects_with_diff_cond_lanes(ptr %ptr, i1 %cond0, i1 %cond1, <2 x i8> %op0, <2 x i8> %op1) { ; CHECK-LABEL: define void @selects_with_diff_cond_lanes( ; CHECK-SAME: ptr [[PTR:%.*]], i1 [[COND0:%.*]], i1 [[COND1:%.*]], <2 x i8> [[OP0:%.*]], <2 x i8> [[OP1:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[LD0:%.*]] = load <2 x i8>, ptr [[PTR0]], align 2 ; CHECK-NEXT: [[LD1:%.*]] = load <2 x i8>, ptr [[PTR1]], align 2 ; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[COND0]], <2 x i8> [[LD0]], <2 x i8> [[LD0]] ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND1]], <2 x i8> [[LD1]], <2 x i8> [[LD1]] ; CHECK-NEXT: [[VPACK:%.*]] = extractelement <2 x i8> [[SEL0]], i32 0 ; CHECK-NEXT: [[VPACK1:%.*]] = insertelement <4 x i8> poison, i8 [[VPACK]], i32 0 ; CHECK-NEXT: [[VPACK2:%.*]] = extractelement <2 x i8> [[SEL0]], i32 1 ; CHECK-NEXT: [[VPACK3:%.*]] = insertelement <4 x i8> [[VPACK1]], i8 [[VPACK2]], i32 1 ; CHECK-NEXT: [[VPACK4:%.*]] = extractelement <2 x i8> [[SEL1]], i32 0 ; CHECK-NEXT: [[VPACK5:%.*]] = insertelement <4 x i8> [[VPACK3]], i8 [[VPACK4]], i32 2 ; CHECK-NEXT: [[VPACK6:%.*]] = extractelement <2 x i8> [[SEL1]], i32 1 ; CHECK-NEXT: [[VPACK7:%.*]] = insertelement <4 x i8> [[VPACK5]], i8 [[VPACK6]], i32 3 ; CHECK-NEXT: store <4 x i8> [[VPACK7]], ptr [[PTR0]], align 2 ; CHECK-NEXT: ret void ; %ptr0 = getelementptr <2 x i8>, ptr %ptr, i32 0 %ptr1 = getelementptr <2 x i8>, ptr %ptr, i32 1 %ld0 = load <2 x i8>, ptr %ptr0 %ld1 = load <2 x i8>, ptr %ptr1 %sel0 = select i1 %cond0, <2 x i8> %ld0, <2 x i8> %ld0 %sel1 = select i1 %cond1, <2 x i8> %ld1, <2 x i8> %ld1 store <2 x i8> %sel0, ptr %ptr0 store <2 x i8> %sel1, ptr %ptr1 ret void } ; TODO: Selects that share the same condition need special treatment. define void @selects_with_common_condition_but_diff_lanes(ptr %ptr, i1 %cond, <2 x i8> %op0, <2 x i8> %op1) { ; CHECK-LABEL: define void @selects_with_common_condition_but_diff_lanes( ; CHECK-SAME: ptr [[PTR:%.*]], i1 [[COND:%.*]], <2 x i8> [[OP0:%.*]], <2 x i8> [[OP1:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[LD0:%.*]] = load <2 x i8>, ptr [[PTR0]], align 2 ; CHECK-NEXT: [[LD1:%.*]] = load <2 x i8>, ptr [[PTR1]], align 2 ; CHECK-NEXT: [[SEL0:%.*]] = select i1 [[COND]], <2 x i8> [[LD0]], <2 x i8> [[LD0]] ; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND]], <2 x i8> [[LD1]], <2 x i8> [[LD1]] ; CHECK-NEXT: [[VPACK:%.*]] = extractelement <2 x i8> [[SEL0]], i32 0 ; CHECK-NEXT: [[VPACK1:%.*]] = insertelement <4 x i8> poison, i8 [[VPACK]], i32 0 ; CHECK-NEXT: [[VPACK2:%.*]] = extractelement <2 x i8> [[SEL0]], i32 1 ; CHECK-NEXT: [[VPACK3:%.*]] = insertelement <4 x i8> [[VPACK1]], i8 [[VPACK2]], i32 1 ; CHECK-NEXT: [[VPACK4:%.*]] = extractelement <2 x i8> [[SEL1]], i32 0 ; CHECK-NEXT: [[VPACK5:%.*]] = insertelement <4 x i8> [[VPACK3]], i8 [[VPACK4]], i32 2 ; CHECK-NEXT: [[VPACK6:%.*]] = extractelement <2 x i8> [[SEL1]], i32 1 ; CHECK-NEXT: [[VPACK7:%.*]] = insertelement <4 x i8> [[VPACK5]], i8 [[VPACK6]], i32 3 ; CHECK-NEXT: store <4 x i8> [[VPACK7]], ptr [[PTR0]], align 2 ; CHECK-NEXT: ret void ; %ptr0 = getelementptr <2 x i8>, ptr %ptr, i32 0 %ptr1 = getelementptr <2 x i8>, ptr %ptr, i32 1 %ld0 = load <2 x i8>, ptr %ptr0 %ld1 = load <2 x i8>, ptr %ptr1 %sel0 = select i1 %cond, <2 x i8> %ld0, <2 x i8> %ld0 %sel1 = select i1 %cond, <2 x i8> %ld1, <2 x i8> %ld1 store <2 x i8> %sel0, ptr %ptr0 store <2 x i8> %sel1, ptr %ptr1 ret void } ; Selects with conditions of the same number of lanes as the instruction itself be vectorized as usual. define void @selects_same_cond_lanes(ptr %ptr, <2 x i1> %cond0, <2 x i1> %cond1, <2 x i8> %op0, <2 x i8> %op1) { ; CHECK-LABEL: define void @selects_same_cond_lanes( ; CHECK-SAME: ptr [[PTR:%.*]], <2 x i1> [[COND0:%.*]], <2 x i1> [[COND1:%.*]], <2 x i8> [[OP0:%.*]], <2 x i8> [[OP1:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr <2 x i8>, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[VPACK:%.*]] = extractelement <2 x i1> [[COND0]], i32 0 ; CHECK-NEXT: [[VPACK1:%.*]] = insertelement <4 x i1> poison, i1 [[VPACK]], i32 0 ; CHECK-NEXT: [[VPACK2:%.*]] = extractelement <2 x i1> [[COND0]], i32 1 ; CHECK-NEXT: [[VPACK3:%.*]] = insertelement <4 x i1> [[VPACK1]], i1 [[VPACK2]], i32 1 ; CHECK-NEXT: [[VPACK4:%.*]] = extractelement <2 x i1> [[COND1]], i32 0 ; CHECK-NEXT: [[VPACK5:%.*]] = insertelement <4 x i1> [[VPACK3]], i1 [[VPACK4]], i32 2 ; CHECK-NEXT: [[VPACK6:%.*]] = extractelement <2 x i1> [[COND1]], i32 1 ; CHECK-NEXT: [[VPACK7:%.*]] = insertelement <4 x i1> [[VPACK5]], i1 [[VPACK6]], i32 3 ; CHECK-NEXT: [[VECL:%.*]] = load <4 x i8>, ptr [[PTR0]], align 2 ; CHECK-NEXT: [[VEC:%.*]] = select <4 x i1> [[VPACK7]], <4 x i8> [[VECL]], <4 x i8> [[VECL]] ; CHECK-NEXT: store <4 x i8> [[VEC]], ptr [[PTR0]], align 2 ; CHECK-NEXT: ret void ; %ptr0 = getelementptr <2 x i8>, ptr %ptr, i32 0 %ptr1 = getelementptr <2 x i8>, ptr %ptr, i32 1 %ld0 = load <2 x i8>, ptr %ptr0 %ld1 = load <2 x i8>, ptr %ptr1 %sel0 = select <2 x i1> %cond0, <2 x i8> %ld0, <2 x i8> %ld0 %sel1 = select <2 x i1> %cond1, <2 x i8> %ld1, <2 x i8> %ld1 store <2 x i8> %sel0, ptr %ptr0 store <2 x i8> %sel1, ptr %ptr1 ret void }