[Bf-blender-cvs] [ffe0796c41e] functions: use first-class llvm vector for Vector type

Jacques Lucke noreply at git.blender.org
Tue Apr 30 13:59:21 CEST 2019


Commit: ffe0796c41eeb5fcf5a7bb68c929bb7b782c8b18
Author: Jacques Lucke
Date:   Tue Apr 30 13:58:13 2019 +0200
Branches: functions
https://developer.blender.org/rBffe0796c41eeb5fcf5a7bb68c929bb7b782c8b18

use first-class llvm vector for Vector type

===================================================================

M	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/functions/vectors.cpp
M	source/blender/functions/types/numeric.cpp

===================================================================

diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index c84d5800a6d..fc74bd3657f 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -45,6 +45,11 @@ class CodeBuilder {
     return m_builder.GetInsertBlock();
   }
 
+  llvm::Type *getFloatTy()
+  {
+    return m_builder.getFloatTy();
+  }
+
   llvm::Type *getVoidTy()
   {
     return m_builder.getVoidTy();
@@ -78,6 +83,11 @@ class CodeBuilder {
   /* Value Builders
      **************************************/
 
+  llvm::Value *getUndef(llvm::Type *type)
+  {
+    return llvm::UndefValue::get(type);
+  }
+
   llvm::Value *getVoidPtr(void *ptr)
   {
     return this->getPtr(ptr, this->getVoidPtrTy());
@@ -173,14 +183,28 @@ class CodeBuilder {
 
   llvm::Value *CreateExtractValue(llvm::Value *aggregate, uint index)
   {
+    BLI_assert(aggregate->getType()->isStructTy());
     return m_builder.CreateExtractValue(aggregate, index);
   }
 
   llvm::Value *CreateInsertValue(llvm::Value *aggregate, llvm::Value *value, uint index)
   {
+    BLI_assert(aggregate->getType()->isStructTy());
     return m_builder.CreateInsertValue(aggregate, value, index);
   }
 
+  llvm::Value *CreateExtractElement(llvm::Value *vector, uint index)
+  {
+    BLI_assert(vector->getType()->isVectorTy());
+    return m_builder.CreateExtractElement(vector, index);
+  }
+
+  llvm::Value *CreateInsertElement(llvm::Value *vector, llvm::Value *value, uint index)
+  {
+    BLI_assert(vector->getType()->isVectorTy());
+    return m_builder.CreateInsertElement(vector, value, index);
+  }
+
   llvm::Value *CreateCallPointer(void *func_ptr,
                                  llvm::FunctionType *ftype,
                                  const LLVMValues &args);
diff --git a/source/blender/functions/functions/vectors.cpp b/source/blender/functions/functions/vectors.cpp
index 1889f974e8a..11bf4d9f2d4 100644
--- a/source/blender/functions/functions/vectors.cpp
+++ b/source/blender/functions/functions/vectors.cpp
@@ -18,10 +18,10 @@ class CombineVectorGen : public LLVMBuildIRBody {
   {
     llvm::Type *vector_ty = get_llvm_type(GET_TYPE_fvec3(), builder.getContext());
 
-    llvm::Value *vector = llvm::UndefValue::get(vector_ty);
-    vector = builder.CreateInsertValue(vector, interface.get_input(0), 0);
-    vector = builder.CreateInsertValue(vector, interface.get_input(1), 1);
-    vector = builder.CreateInsertValue(vector, interface.get_input(2), 2);
+    llvm::Value *vector = builder.getUndef(vector_ty);
+    vector = builder.CreateInsertElement(vector, interface.get_input(0), 0);
+    vector = builder.CreateInsertElement(vector, interface.get_input(1), 1);
+    vector = builder.CreateInsertElement(vector, interface.get_input(2), 2);
     interface.set_output(0, vector);
   }
 };
@@ -124,10 +124,9 @@ class AddVectorsGen : public LLVMBuildIRBody {
                 CodeInterface &interface,
                 const BuildIRSettings &UNUSED(settings)) const override
   {
-    llvm::Value *a = builder.CreateStructToVector(interface.get_input(0));
-    llvm::Value *b = builder.CreateStructToVector(interface.get_input(1));
+    llvm::Value *a = interface.get_input(0);
+    llvm::Value *b = interface.get_input(1);
     llvm::Value *result = builder.CreateFAdd(a, b);
-    result = builder.CreateVectorToStruct(result);
     interface.set_output(0, result);
   }
 };
diff --git a/source/blender/functions/types/numeric.cpp b/source/blender/functions/types/numeric.cpp
index eb7d58a546d..4e59a8003c7 100644
--- a/source/blender/functions/types/numeric.cpp
+++ b/source/blender/functions/types/numeric.cpp
@@ -25,14 +25,50 @@ LAZY_INIT_REF__NO_ARG(SharedType, GET_TYPE_int32)
   return type;
 }
 
+class FloatVectorType : public TrivialLLVMTypeInfo {
+ private:
+  uint m_size;
+
+ public:
+  FloatVectorType(uint size) : m_size(size)
+  {
+  }
+
+  llvm::Type *get_type(llvm::LLVMContext &context) const override
+  {
+    return llvm::VectorType::get(llvm::Type::getFloatTy(context), m_size);
+  }
+
+  void build_store_ir__copy(CodeBuilder &builder,
+                            llvm::Value *vector,
+                            llvm::Value *address) const override
+  {
+    address = builder.CastToPointerOf(address, builder.getFloatTy());
+    for (uint i = 0; i < m_size; i++) {
+      llvm::Value *value = builder.CreateExtractElement(vector, i);
+      llvm::Value *value_address = builder.CreateConstGEP1_32(address, i);
+      builder.CreateStore(value, value_address);
+    }
+  }
+
+  llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
+  {
+    llvm::Value *vector = builder.getUndef(this->get_type(builder.getContext()));
+    address = builder.CastToPointerOf(address, builder.getFloatTy());
+    for (uint i = 0; i < m_size; i++) {
+      llvm::Value *value_address = builder.CreateConstGEP1_32(address, i);
+      llvm::Value *value = builder.CreateLoad(value_address);
+      vector = builder.CreateInsertElement(vector, value, i);
+    }
+    return vector;
+  }
+};
+
 LAZY_INIT_REF__NO_ARG(SharedType, GET_TYPE_fvec3)
 {
   SharedType type = SharedType::New("FVec3");
   type->extend(new CPPTypeInfoForType<Vector>());
-  type->extend(new PackedLLVMTypeInfo([](llvm::LLVMContext &context) {
-    llvm::Type *base = llvm::Type::getFloatTy(context);
-    return llvm::StructType::get(context, {base, base, base}, true);
-  }));
+  type->extend(new FloatVectorType(3));
   return type;
 }



More information about the Bf-blender-cvs mailing list