SelectInsts need special treatment because they are not always straightforward to vectorize. This patch disables vectorization unless they are trivially vectorizable.
98 lines
5.8 KiB
LLVM
98 lines
5.8 KiB
LLVM
; 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="bottom-up-vec<>" %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
|
|
}
|