[PATCH] [IRBuilder] A method for creating a vector from scalar values

Paweł Bylica chfast at gmail.com
Thu Apr 30 06:48:54 PDT 2015


IRBuilder::CreateVectorPack method takes an array of values of the same scalar type and packs them into a vector with series of instertelement instructions.

http://reviews.llvm.org/D9372

Files:
  include/llvm/IR/IRBuilder.h
  unittests/IR/IRBuilderTest.cpp

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<Value *> 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);
+}
+
 
 }

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D9372.24703.patch
Type: text/x-patch
Size: 1720 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150430/ddc1827b/attachment.bin>


More information about the llvm-commits mailing list