[llvm] [SROA] Use tree-structure merge to remove alloca (PR #152793)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 22 14:06:07 PDT 2025
================
@@ -2667,6 +2668,96 @@ static Value *insertVector(IRBuilderTy &IRB, Value *Old, Value *V,
return V;
}
+/// This function takes two vector values and combines them into a single vector
+/// by concatenating their elements. The function handles:
+///
+/// 1. Element type mismatch: If either vector's element type differs from
+/// NewAIEltType, the function bitcasts the vector to use NewAIEltType while
+/// preserving the total bit width (adjusting the number of elements
+/// accordingly).
+///
+/// 2. Size mismatch: After transforming the vectors to have the desired element
+/// type, if the two vectors have different numbers of elements, the smaller
+/// vector is extended with poison values to match the size of the larger
+/// vector before concatenation.
+///
+/// 3. Concatenation: The vectors are merged using a shuffle operation that
+/// places all elements of V0 first, followed by all elements of V1.
+///
+/// \param V0 The first vector to merge (must be a vector type)
+/// \param V1 The second vector to merge (must be a vector type)
+/// \param DL The data layout for size calculations
+/// \param NewAIEltTy The desired element type for the result vector
+/// \param Builder IRBuilder for creating new instructions
+/// \return A new vector containing all elements from V0 followed by all
+/// elements from V1
+static Value *mergeTwoVectors(Value *V0, Value *V1, const DataLayout &DL,
+ Type *NewAIEltTy, IRBuilder<> &Builder) {
+ assert(V0->getType()->isVectorTy() && V1->getType()->isVectorTy() &&
+ "Can not merge two non-vector values");
+
+ // V0 and V1 are vectors
+ // Create a new vector type with combined elements
+ // Use ShuffleVector to concatenate the vectors
+ auto *VecType0 = cast<FixedVectorType>(V0->getType());
+ auto *VecType1 = cast<FixedVectorType>(V1->getType());
----------------
nikic wrote:
You can just drop the assert, as `cast<>` is an assert by itself.
https://github.com/llvm/llvm-project/pull/152793
More information about the llvm-commits
mailing list