Skip to content

Commit 6c34f44

Browse files
committed
Addressed comments
1 parent 6a37fdc commit 6c34f44

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
@@ -3756,22 +3756,27 @@ static Constant *ConstantFoldFixedVectorCall(
37563756
}
37573757
case Intrinsic::vector_extract: {
37583758
auto *Vec = dyn_cast<Constant>(Operands[0]);
3759-
auto *Idx = dyn_cast<ConstantInt>(Operands[1]);
3760-
if (!Vec || !Idx)
3759+
auto *Idx = cast<ConstantInt>(Operands[1]);
3760+
if (!Vec || !Idx || !isa<FixedVectorType>(Vec->getType()))
37613761
return nullptr;
37623762

37633763
unsigned NumElements = FVTy->getNumElements();
37643764
unsigned VecNumElements =
37653765
cast<FixedVectorType>(Vec->getType())->getNumElements();
37663766
unsigned StartingIndex = Idx->getZExtValue();
3767+
37673768
// Extracting entire vector is nop
37683769
if (NumElements == VecNumElements && StartingIndex == 0)
37693770
return Vec;
37703771

37713772
const unsigned NonPoisonNumElements =
37723773
std::min(StartingIndex + NumElements, VecNumElements);
3773-
for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I)
3774-
Result[I - StartingIndex] = Vec->getAggregateElement(I);
3774+
for (unsigned I = StartingIndex; I < NonPoisonNumElements; ++I) {
3775+
Constant *Elt = Vec->getAggregateElement(I);
3776+
if (!Elt)
3777+
return nullptr;
3778+
Result[I - StartingIndex] = Elt;
3779+
}
37753780

37763781
// Remaining elements are poison since they are out of bounds.
37773782
for (unsigned I = NonPoisonNumElements, E = StartingIndex + NumElements;
@@ -3784,7 +3789,7 @@ static Constant *ConstantFoldFixedVectorCall(
37843789
auto *Vec = dyn_cast<Constant>(Operands[0]);
37853790
auto *SubVec = dyn_cast<Constant>(Operands[1]);
37863791
auto *Idx = dyn_cast<ConstantInt>(Operands[2]);
3787-
if (!Vec || !SubVec || !Idx)
3792+
if (!Vec || !SubVec || !Idx || !isa<FixedVectorType>(Vec->getType()))
37883793
return nullptr;
37893794

37903795
unsigned SubVecNumElements =
@@ -3803,12 +3808,24 @@ static Constant *ConstantFoldFixedVectorCall(
38033808
return PoisonValue::get(FVTy);
38043809

38053810
unsigned I = 0;
3806-
for (; I < IdxN; ++I)
3807-
Result[I] = Vec->getAggregateElement(I);
3808-
for (; I < IdxN + SubVecNumElements; ++I)
3809-
Result[I] = SubVec->getAggregateElement(I - IdxN);
3810-
for (; I < VecNumElements; ++I)
3811-
Result[I] = Vec->getAggregateElement(I);
3811+
for (; I < IdxN; ++I) {
3812+
Constant *Elt = Vec->getAggregateElement(I);
3813+
if (!Elt)
3814+
return nullptr;
3815+
Result[I] = Elt;
3816+
}
3817+
for (; I < IdxN + SubVecNumElements; ++I) {
3818+
Constant *Elt = SubVec->getAggregateElement(I - IdxN);
3819+
if (!Elt)
3820+
return nullptr;
3821+
Result[I] = Elt;
3822+
}
3823+
for (; I < VecNumElements; ++I) {
3824+
Constant *Elt = Vec->getAggregateElement(I);
3825+
if (!Elt)
3826+
return nullptr;
3827+
Result[I] = Elt;
3828+
}
38123829
return ConstantVector::get(Result);
38133830
}
38143831
case Intrinsic::vector_interleave2: {
@@ -3820,8 +3837,12 @@ static Constant *ConstantFoldFixedVectorCall(
38203837
unsigned NumElements =
38213838
cast<FixedVectorType>(Vec0->getType())->getNumElements();
38223839
for (unsigned I = 0; I < NumElements; ++I) {
3823-
Result[2 * I] = Vec0->getAggregateElement(I);
3824-
Result[2 * I + 1] = Vec1->getAggregateElement(I);
3840+
Constant *Elt0 = Vec0->getAggregateElement(I);
3841+
Constant *Elt1 = Vec1->getAggregateElement(I);
3842+
if (!Elt0 || !Elt1)
3843+
return nullptr;
3844+
Result[2 * I] = Elt0;
3845+
Result[2 * I + 1] = Elt1;
38253846
}
38263847
return ConstantVector::get(Result);
38273848
}
@@ -3996,8 +4017,12 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID,
39964017
2;
39974018
SmallVector<Constant *, 4> Res0(NumElements), Res1(NumElements);
39984019
for (unsigned I = 0; I < NumElements; ++I) {
3999-
Res0[I] = Vec->getAggregateElement(2 * I);
4000-
Res1[I] = Vec->getAggregateElement(2 * I + 1);
4020+
Constant *Elt0 = Vec->getAggregateElement(2 * I);
4021+
Constant *Elt1 = Vec->getAggregateElement(2 * I + 1);
4022+
if (!Elt0 || !Elt1)
4023+
return nullptr;
4024+
Res0[I] = Elt0;
4025+
Res1[I] = Elt1;
40014026
}
40024027
return ConstantStruct::get(StTy, ConstantVector::get(Res0),
40034028
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)