mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[InstCombine] Add instcombine fold for extractelement + splat for scalable vectors
This patch allows that scalable vector can also use the fold that already exists for fixed vector, only when the lane index is lower than the minimum number of elements of the vector. Differential Revision: https://reviews.llvm.org/D102404
This commit is contained in:
parent
7a134236e4
commit
dcc4b87d6f
@ -4495,9 +4495,13 @@ static Value *SimplifyExtractElementInst(Value *Vec, Value *Idx,
|
||||
// find a previously computed scalar that was inserted into the vector.
|
||||
if (auto *IdxC = dyn_cast<ConstantInt>(Idx)) {
|
||||
// For fixed-length vector, fold into undef if index is out of bounds.
|
||||
if (isa<FixedVectorType>(VecVTy) &&
|
||||
IdxC->getValue().uge(cast<FixedVectorType>(VecVTy)->getNumElements()))
|
||||
unsigned MinNumElts = VecVTy->getElementCount().getKnownMinValue();
|
||||
if (isa<FixedVectorType>(VecVTy) && IdxC->getValue().uge(MinNumElts))
|
||||
return PoisonValue::get(VecVTy->getElementType());
|
||||
// Handle case where an element is extracted from a splat.
|
||||
if (IdxC->getValue().ult(MinNumElts))
|
||||
if (auto *Splat = getSplatValue(Vec))
|
||||
return Splat;
|
||||
if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue()))
|
||||
return Elt;
|
||||
}
|
||||
|
@ -61,10 +61,7 @@ define i32* @vector_splat_ptrs_v2i64_ext0(i32* %a, i64 %index) {
|
||||
|
||||
define i32* @vector_splat_ptrs_nxv2i64_ext0(i32* %a, i64 %index) {
|
||||
; CHECK-LABEL: @vector_splat_ptrs_nxv2i64_ext0(
|
||||
; CHECK-NEXT: [[TMP:%.*]] = insertelement <vscale x 2 x i32*> poison, i32* [[A:%.*]], i32 0
|
||||
; CHECK-NEXT: [[SPLATOFA:%.*]] = shufflevector <vscale x 2 x i32*> [[TMP]], <vscale x 2 x i32*> poison, <vscale x 2 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = extractelement <vscale x 2 x i32*> [[SPLATOFA]], i32 0
|
||||
; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, i32* [[TMP0]], i64 [[INDEX:%.*]]
|
||||
; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, i32* [[A:%.*]], i64 [[INDEX:%.*]]
|
||||
; CHECK-NEXT: ret i32* [[RES]]
|
||||
;
|
||||
%tmp = insertelement <vscale x 2 x i32*> poison, i32* %a, i32 0
|
||||
|
@ -55,13 +55,9 @@ define i8 @extractelement_bitcast_wrong_insert(<vscale x 2 x i32> %a, i32 %x) {
|
||||
ret i8 %r
|
||||
}
|
||||
|
||||
; TODO: Instcombine could optimize to return %v.
|
||||
define i32 @extractelement_shuffle_in_range(i32 %v) {
|
||||
; CHECK-LABEL: @extractelement_shuffle_in_range(
|
||||
; CHECK-NEXT: [[IN:%.*]] = insertelement <vscale x 4 x i32> poison, i32 [[V:%.*]], i32 0
|
||||
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[SPLAT]], i32 1
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
; CHECK-NEXT: ret i32 %v
|
||||
;
|
||||
%in = insertelement <vscale x 4 x i32> poison, i32 %v, i32 0
|
||||
%splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
|
||||
|
@ -55,13 +55,9 @@ define i8 @extractelement_bitcast_wrong_insert(<vscale x 2 x i32> %a, i32 %x) {
|
||||
ret i8 %r
|
||||
}
|
||||
|
||||
; TODO: Instcombine could optimize to return %v.
|
||||
define i32 @extractelement_shuffle_in_range(i32 %v) {
|
||||
; CHECK-LABEL: @extractelement_shuffle_in_range(
|
||||
; CHECK-NEXT: [[IN:%.*]] = insertelement <vscale x 4 x i32> undef, i32 [[V:%.*]], i32 0
|
||||
; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <vscale x 4 x i32> [[IN]], <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
|
||||
; CHECK-NEXT: [[R:%.*]] = extractelement <vscale x 4 x i32> [[SPLAT]], i32 1
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
; CHECK-NEXT: ret i32 %v
|
||||
;
|
||||
%in = insertelement <vscale x 4 x i32> undef, i32 %v, i32 0
|
||||
%splat = shufflevector <vscale x 4 x i32> %in, <vscale x 4 x i32> undef, <vscale x 4 x i32> zeroinitializer
|
||||
|
Loading…
Reference in New Issue
Block a user