[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