Index: include/llvm/IR/IRBuilder.h =================================================================== --- include/llvm/IR/IRBuilder.h +++ include/llvm/IR/IRBuilder.h @@ -1609,6 +1609,19 @@ return CreateShuffleVector(V, Undef, Zeros, Name + ".splat"); } + /// \brief Create a vector from scalar values. + /// + /// Returns a vector value with elements \p Elts inserted into it. + /// All elements values must have the same scalar type. + Value *CreateVectorPack(ArrayRef Elts, const Twine &Name = "") { + assert(Elts.size() > 0 && "Cannot pack an empty vector"); + auto *VectorTy = VectorType::get(Elts.front()->getType(), Elts.size()); + Value *Vec = UndefValue::get(VectorTy); + for (size_t i = 0; i < Elts.size(); ++i) + Vec = CreateInsertElement(Vec, Elts[i], i, Name + ".pack"); + return Vec; + } + /// \brief Return a value that has been extracted from a larger integer type. Value *CreateExtractInteger(const DataLayout &DL, Value *From, IntegerType *ExtractedTy, uint64_t Offset, Index: unittests/IR/IRBuilderTest.cpp =================================================================== --- unittests/IR/IRBuilderTest.cpp +++ unittests/IR/IRBuilderTest.cpp @@ -321,5 +321,17 @@ EXPECT_EQ(Elt2, X2); } +TEST_F(IRBuilderTest, VectorPack) { + IRBuilder<> Builder(BB); + + Value *Elts[] = {Builder.getInt16(-1), + Builder.getInt16(-2), + Builder.getInt16(-3)}; + auto *Vec = Builder.CreateVectorPack(Elts, "v"); + EXPECT_EQ(VectorType::get(Builder.getInt16Ty(), 3), Vec->getType()); + auto *Elt2 = Builder.CreateExtractElement(Vec, 2); + EXPECT_EQ(Builder.getInt16(-3), Elt2); +} + }