| ; 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<tr-save,bottom-up-vec,tr-accept>" %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 |
| } |