Skip to content

Commit 55c7971

Browse files
committed
Addressed comments
1 parent a621a64 commit 55c7971

File tree

2 files changed

+50
-15
lines changed

2 files changed

+50
-15
lines changed

llvm/lib/Analysis/ConstantFolding.cpp

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3740,22 +3740,27 @@ static Constant *ConstantFoldFixedVectorCall(
37403740
}
37413741
case Intrinsic::vector_extract: {
37423742
auto *Vec = dyn_cast<Constant>(Operands[0]);
3743-
auto *Idx = dyn_cast<ConstantInt>(Operands[1]);
3744-
if (!Vec || !Idx)
3743+
auto *Idx = cast<ConstantInt>(Operands[1]);
3744+
if (!Vec || !Idx || !isa<FixedVectorType>(Vec->getType()))
37453745
return nullptr;
37463746

37473747
unsigned NumElements = FVTy->getNumElements();
37483748
unsigned VecNumElements =
37493749
cast<FixedVectorType>(Vec->getType())->getNumElements();
37503750
unsigned StartingIndex = Idx->getZExtValue();
3751+
37513752
// Extracting entire vector is nop
37523753
if (NumElements == VecNumElements && StartingIndex == 0)
37533754
return Vec;
37543755

37553756
const unsigned NonPoisonNumElements =
37563757
std::min(StartingIndex + NumElements, VecNumElements);
3757-
for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I)
3758-
Result[I - StartingIndex] = Vec->getAggregateElement(I);
3758+
for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I) {
3759+
Constant *Elt = Vec->getAggregateElement(I);
3760+
if (!Elt)
3761+
return nullptr;
3762+
Result[I - StartingIndex] = Elt;
3763+
}
37593764

37603765
// Remaining elements are poison since they are out of bounds.
37613766
for (unsigned I = NonPoisonNumElements, E = StartingIndex + NumElements;
@@ -3768,7 +3773,7 @@ static Constant *ConstantFoldFixedVectorCall(
37683773
auto *Vec = dyn_cast<Constant>(Operands[0]);
37693774
auto *SubVec = dyn_cast<Constant>(Operands[1]);
37703775
auto *Idx = dyn_cast<ConstantInt>(Operands[2]);
3771-
if (!Vec || !SubVec || !Idx)
3776+
if (!Vec || !SubVec || !Idx || !isa<FixedVectorType>(Vec->getType()))
37723777
return nullptr;
37733778

37743779
unsigned SubVecNumElements =
@@ -3787,12 +3792,24 @@ static Constant *ConstantFoldFixedVectorCall(
37873792
return PoisonValue::get(FVTy);
37883793

37893794
unsigned I = 0;
3790-
for (; I < IdxN; ++I)
3791-
Result[I] = Vec->getAggregateElement(I);
3792-
for (; I < IdxN + SubVecNumElements; ++I)
3793-
Result[I] = SubVec->getAggregateElement(I - IdxN);
3794-
for (; I < VecNumElements; ++I)
3795-
Result[I] = Vec->getAggregateElement(I);
3795+
for (; I < IdxN; ++I) {
3796+
Constant *Elt = Vec->getAggregateElement(I);
3797+
if (!Elt)
3798+
return nullptr;
3799+
Result[I] = Elt;
3800+
}
3801+
for (; I < IdxN + SubVecNumElements; ++I) {
3802+
Constant *Elt = SubVec->getAggregateElement(I - IdxN);
3803+
if (!Elt)
3804+
return nullptr;
3805+
Result[I] = Elt;
3806+
}
3807+
for (; I < VecNumElements; ++I) {
3808+
Constant *Elt = Vec->getAggregateElement(I);
3809+
if (!Elt)
3810+
return nullptr;
3811+
Result[I] = Elt;
3812+
}
37963813
return ConstantVector::get(Result);
37973814
}
37983815
case Intrinsic::vector_interleave2: {
@@ -3804,8 +3821,12 @@ static Constant *ConstantFoldFixedVectorCall(
38043821
unsigned NumElements =
38053822
cast<FixedVectorType>(Vec0->getType())->getNumElements();
38063823
for (unsigned I = 0; I < NumElements; ++I) {
3807-
Result[2 * I] = Vec0->getAggregateElement(I);
3808-
Result[2 * I + 1] = Vec1->getAggregateElement(I);
3824+
Constant *Elt0 = Vec0->getAggregateElement(I);
3825+
Constant *Elt1 = Vec1->getAggregateElement(I);
3826+
if (!Elt0 || !Elt1)
3827+
return nullptr;
3828+
Result[2 * I] = Elt0;
3829+
Result[2 * I + 1] = Elt1;
38093830
}
38103831
return ConstantVector::get(Result);
38113832
}
@@ -3957,8 +3978,12 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID,
39573978
2;
39583979
SmallVector<Constant *, 4> Res0(NumElements), Res1(NumElements);
39593980
for (unsigned I = 0; I < NumElements; ++I) {
3960-
Res0[I] = Vec->getAggregateElement(2 * I);
3961-
Res1[I] = Vec->getAggregateElement(2 * I + 1);
3981+
Constant *Elt0 = Vec->getAggregateElement(2 * I);
3982+
Constant *Elt1 = Vec->getAggregateElement(2 * I + 1);
3983+
if (!Elt0 || !Elt1)
3984+
return nullptr;
3985+
Res0[I] = Elt0;
3986+
Res1[I] = Elt1;
39623987
}
39633988
return ConstantStruct::get(StTy, ConstantVector::get(Res0),
39643989
ConstantVector::get(Res1));

llvm/test/Transforms/InstSimplify/ConstProp/vector-calls.ll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ define <3 x i32> @fold_vector_extract() {
99
ret <3 x i32> %1
1010
}
1111

12+
@a = external global i16, align 1
13+
14+
define <3 x i32> @fold_vector_extract_constexpr() {
15+
; CHECK-LABEL: define <3 x i32> @fold_vector_extract_constexpr() {
16+
; CHECK-NEXT: ret <3 x i32> <i32 ptrtoint (ptr @a to i32), i32 1, i32 2>
17+
;
18+
%1 = call <3 x i32> @llvm.vector.extract.v3i32.v8i32(<8 x i32> <i32 ptrtoint (ptr @a to i32), i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>, i64 0)
19+
ret <3 x i32> %1
20+
}
21+
1222
define <3 x i32> @fold_vector_extract_last_poison() {
1323
; CHECK-LABEL: define <3 x i32> @fold_vector_extract_last_poison() {
1424
; CHECK-NEXT: ret <3 x i32> <i32 6, i32 7, i32 poison>

0 commit comments

Comments
 (0)