aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ConstantFolding.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2025-06-13 17:11:52 -0700
committerGitHub <noreply@github.com>2025-06-13 17:11:52 -0700
commit417ab37d85ad1bb3e5623dff487ef108404e37f5 (patch)
treef1192de20e0dac69344eb99234eae5919c28ad8f /llvm/lib/Analysis/ConstantFolding.cpp
parent7f69cd578de899f8b00525a02d1fe25dab567bcf (diff)
downloadllvm-417ab37d85ad1bb3e5623dff487ef108404e37f5.zip
llvm-417ab37d85ad1bb3e5623dff487ef108404e37f5.tar.gz
llvm-417ab37d85ad1bb3e5623dff487ef108404e37f5.tar.bz2
[ConstantFolding] Fold deinterleave2 of any splat vector not just zeroinitializer (#144144)
While there remove an unnecessary dyn_cast from Constant to Constant. Reverse a branch condition into an early out to reduce nesting.
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp43
1 files changed, 21 insertions, 22 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 64a0f46..2b7a438 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -3990,31 +3990,30 @@ ConstantFoldStructCall(StringRef Name, Intrinsic::ID IntrinsicID,
return ConstantStruct::get(StTy, SinResult, CosResult);
}
case Intrinsic::vector_deinterleave2: {
- auto *Vec = dyn_cast<Constant>(Operands[0]);
- if (!Vec)
- return nullptr;
-
+ auto *Vec = Operands[0];
auto *VecTy = cast<VectorType>(Vec->getType());
- unsigned NumElements = VecTy->getElementCount().getKnownMinValue() / 2;
- if (isa<ConstantAggregateZero>(Vec)) {
- auto *HalfVecTy = VectorType::getHalfElementsVectorType(VecTy);
- return ConstantStruct::get(StTy, ConstantAggregateZero::get(HalfVecTy),
- ConstantAggregateZero::get(HalfVecTy));
+
+ if (auto *EltC = Vec->getSplatValue()) {
+ ElementCount HalfEC = VecTy->getElementCount().divideCoefficientBy(2);
+ auto *HalfVec = ConstantVector::getSplat(HalfEC, EltC);
+ return ConstantStruct::get(StTy, HalfVec, HalfVec);
}
- if (isa<FixedVectorType>(Vec->getType())) {
- SmallVector<Constant *, 4> Res0(NumElements), Res1(NumElements);
- for (unsigned I = 0; I < NumElements; ++I) {
- Constant *Elt0 = Vec->getAggregateElement(2 * I);
- Constant *Elt1 = Vec->getAggregateElement(2 * I + 1);
- if (!Elt0 || !Elt1)
- return nullptr;
- Res0[I] = Elt0;
- Res1[I] = Elt1;
- }
- return ConstantStruct::get(StTy, ConstantVector::get(Res0),
- ConstantVector::get(Res1));
+
+ if (!isa<FixedVectorType>(Vec->getType()))
+ return nullptr;
+
+ unsigned NumElements = VecTy->getElementCount().getFixedValue() / 2;
+ SmallVector<Constant *, 4> Res0(NumElements), Res1(NumElements);
+ for (unsigned I = 0; I < NumElements; ++I) {
+ Constant *Elt0 = Vec->getAggregateElement(2 * I);
+ Constant *Elt1 = Vec->getAggregateElement(2 * I + 1);
+ if (!Elt0 || !Elt1)
+ return nullptr;
+ Res0[I] = Elt0;
+ Res1[I] = Elt1;
}
- return nullptr;
+ return ConstantStruct::get(StTy, ConstantVector::get(Res0),
+ ConstantVector::get(Res1));
}
default:
// TODO: Constant folding of vector intrinsics that fall through here does