diff options
author | Craig Topper <craig.topper@sifive.com> | 2025-06-13 17:11:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-13 17:11:52 -0700 |
commit | 417ab37d85ad1bb3e5623dff487ef108404e37f5 (patch) | |
tree | f1192de20e0dac69344eb99234eae5919c28ad8f /llvm/lib/Analysis/ConstantFolding.cpp | |
parent | 7f69cd578de899f8b00525a02d1fe25dab567bcf (diff) | |
download | llvm-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.cpp | 43 |
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 |