[Bf-blender-cvs] [a22b7177d22] functions: improve llvm type info for shared immutable types

Jacques Lucke noreply at git.blender.org
Fri Sep 6 16:55:42 CEST 2019


Commit: a22b7177d22c9d23b9db04c0d638eeafe2342474
Author: Jacques Lucke
Date:   Fri Sep 6 12:17:16 2019 +0200
Branches: functions
https://developer.blender.org/rBa22b7177d22c9d23b9db04c0d638eeafe2342474

improve llvm type info for shared immutable types

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

M	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/backends/llvm/llvm_type_info.hpp
M	source/blender/functions/types/lists.cpp

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

diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index f87278edc9d..2458d3a62eb 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -331,6 +331,11 @@ class CodeBuilder {
     return this->CastToPointerOf(addr, stride_type);
   }
 
+  llvm::Value *CastToAnyPtrPtr(llvm::Value *addr)
+  {
+    return this->CastToPointerOf(addr, this->getAnyPtrTy());
+  }
+
   llvm::Value *CastToAnyPtr(llvm::Value *addr)
   {
     return m_builder.CreatePointerCast(addr, this->getAnyPtrTy());
diff --git a/source/blender/functions/backends/llvm/llvm_type_info.hpp b/source/blender/functions/backends/llvm/llvm_type_info.hpp
index a1794710cbc..29834abcca8 100644
--- a/source/blender/functions/backends/llvm/llvm_type_info.hpp
+++ b/source/blender/functions/backends/llvm/llvm_type_info.hpp
@@ -158,7 +158,7 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
                             llvm::Value *value,
                             llvm::Value *address) const override
   {
-    auto *addr = builder.CastToBytePtr(address);
+    auto *addr = builder.CastToAnyPtrPtr(address);
     builder.CreateStore(value, addr);
   }
 
@@ -171,7 +171,7 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
 
   llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
   {
-    auto *addr = builder.CastToBytePtr(address);
+    auto *addr = builder.CastToAnyPtrPtr(address);
     return builder.CreateLoad(addr);
   }
 
@@ -181,6 +181,86 @@ class PointerRefLLVMTypeInfo : public LLVMTypeInfo {
   }
 };
 
+/**
+ * Use this when the type is reference counted. Furthermore, the type has to be immutable when
+ * object is owned by more than one.
+ */
+template<typename T> class SharedImmutablePointerLLVMTypeInfo : public LLVMTypeInfo {
+ private:
+  static T *copy_by_incrementing_refcount(T *value)
+  {
+    if (value == nullptr) {
+      return nullptr;
+    }
+    else {
+      value->incref();
+      return value;
+    }
+  }
+
+  static void free_by_decrementing_refcount(T *value)
+  {
+    if (value != nullptr) {
+      value->decref();
+    }
+  }
+
+ public:
+  llvm::Type *get_type(llvm::LLVMContext &context) const override
+  {
+    return llvm::Type::getInt8PtrTy(context);
+  }
+
+  llvm::Value *build_copy_ir(CodeBuilder &builder, llvm::Value *value) const override
+  {
+    return builder.CreateCallPointer((void *)copy_by_incrementing_refcount,
+                                     {value},
+                                     builder.getAnyPtrTy(),
+                                     "copy by incrementing refcount");
+  }
+
+  void build_free_ir(CodeBuilder &builder, llvm::Value *value) const override
+  {
+    builder.CreateCallPointer((void *)free_by_decrementing_refcount,
+                              {value},
+                              builder.getVoidTy(),
+                              "free by decrementing refcount");
+  }
+
+  void build_store_ir__copy(CodeBuilder &builder,
+                            llvm::Value *value,
+                            llvm::Value *address) const override
+  {
+    auto copied_value = this->build_copy_ir(builder, value);
+    this->build_store_ir__relocate(builder, copied_value, address);
+  }
+
+  void build_store_ir__relocate(CodeBuilder &builder,
+                                llvm::Value *value,
+                                llvm::Value *address) const override
+  {
+    auto *addr = builder.CastToAnyPtrPtr(address);
+    builder.CreateStore(value, addr);
+  }
+
+  llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
+  {
+    auto *addr = builder.CastToAnyPtrPtr(address);
+    auto *value = builder.CreateLoad(addr);
+    auto *copied_value = this->build_copy_ir(builder, value);
+    return copied_value;
+  }
+
+  llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
+  {
+    auto *addr = builder.CastToAnyPtrPtr(address);
+    auto *value = builder.CreateLoad(addr);
+    auto *nullptr_value = builder.getAnyPtr((void *)nullptr);
+    builder.CreateStore(nullptr_value, addr);
+    return value;
+  }
+};
+
 /**
  * The type has to implement a clone() method.
  */
@@ -232,13 +312,13 @@ template<typename T> class OwningPointerLLVMTypeInfo : public LLVMTypeInfo {
                                 llvm::Value *value,
                                 llvm::Value *address) const override
   {
-    auto *addr = builder.CastToBytePtr(address);
+    auto *addr = builder.CastToAnyPtrPtr(address);
     builder.CreateStore(value, addr);
   }
 
   llvm::Value *build_load_ir__copy(CodeBuilder &builder, llvm::Value *address) const override
   {
-    auto *addr = builder.CastToBytePtr(address);
+    auto *addr = builder.CastToAnyPtrPtr(address);
     auto *value = builder.CreateLoad(addr);
     auto *copied_value = this->build_copy_ir(builder, value);
     return copied_value;
@@ -246,9 +326,9 @@ template<typename T> class OwningPointerLLVMTypeInfo : public LLVMTypeInfo {
 
   llvm::Value *build_load_ir__relocate(CodeBuilder &builder, llvm::Value *address) const override
   {
-    auto *addr = builder.CastToBytePtr(address);
+    auto *addr = builder.CastToAnyPtrPtr(address);
     auto *value = builder.CreateLoad(addr);
-    auto *nullptr_value = builder.getPtr(nullptr, builder.getAnyPtrTy());
+    auto *nullptr_value = builder.getAnyPtr((void *)nullptr);
     builder.CreateStore(nullptr_value, addr);
     return value;
   }
diff --git a/source/blender/functions/types/lists.cpp b/source/blender/functions/types/lists.cpp
index ea7b7be6203..aaa30dd3e83 100644
--- a/source/blender/functions/types/lists.cpp
+++ b/source/blender/functions/types/lists.cpp
@@ -32,20 +32,10 @@ class ListTypeInfo : public CPPTypeInfoForType<SharedList> {
 
 Type *new_list_type(Type *base_type)
 {
+  BLI_STATIC_ASSERT(sizeof(SharedList) == sizeof(List *), "");
   Type *type = new Type(base_type->name() + " List");
   type->add_extension<ListTypeInfo>(base_type);
-  type->add_extension<PointerLLVMTypeInfo>(
-      /* Copy list by incrementing the reference counter. */
-      [](void *list) -> void * {
-        List *list_ = static_cast<List *>(list);
-        list_->incref();
-        return static_cast<void *>(list);
-      },
-      /* Free list by decrementing the reference counter. */
-      [](void *list) {
-        List *list_ = static_cast<List *>(list);
-        list_->decref();
-      });
+  type->add_extension<SharedImmutablePointerLLVMTypeInfo<List>>();
   return type;
 }



More information about the Bf-blender-cvs mailing list