[Bf-blender-cvs] [eaaa8610fab] functions: some llvm usage improvements

Jacques Lucke noreply at git.blender.org
Wed Jul 31 16:20:57 CEST 2019


Commit: eaaa8610fab8b3155c121a758d73b9b18a624d1d
Author: Jacques Lucke
Date:   Wed Jul 31 14:27:30 2019 +0200
Branches: functions
https://developer.blender.org/rBeaaa8610fab8b3155c121a758d73b9b18a624d1d

some llvm usage improvements

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

M	source/blender/functions/FN_llvm.hpp
M	source/blender/functions/backends/llvm/build_ir_body.hpp
M	source/blender/functions/backends/llvm/builder.cpp
M	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/backends/llvm/ir_to_tuple_call.cpp

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

diff --git a/source/blender/functions/FN_llvm.hpp b/source/blender/functions/FN_llvm.hpp
index 85869fa4125..a03699251cd 100644
--- a/source/blender/functions/FN_llvm.hpp
+++ b/source/blender/functions/FN_llvm.hpp
@@ -8,3 +8,4 @@
 #include "backends/llvm/fgraph_ir_generation.hpp"
 #include "backends/llvm/builder.hpp"
 #include "backends/llvm/compile.hpp"
+#include "backends/llvm/context_pool.hpp"
diff --git a/source/blender/functions/backends/llvm/build_ir_body.hpp b/source/blender/functions/backends/llvm/build_ir_body.hpp
index af03d8b9ae6..03428e6900c 100644
--- a/source/blender/functions/backends/llvm/build_ir_body.hpp
+++ b/source/blender/functions/backends/llvm/build_ir_body.hpp
@@ -19,14 +19,14 @@ using FunctionIRCache = Map<void *, llvm::Function *>;
 
 class CodeInterface {
  private:
-  Vector<llvm::Value *> &m_inputs;
-  Vector<llvm::Value *> &m_outputs;
+  ArrayRef<llvm::Value *> m_inputs;
+  ArrayRef<llvm::Value *> m_outputs;
   llvm::Value *m_context_ptr;
   FunctionIRCache &m_function_ir_cache;
 
  public:
-  CodeInterface(Vector<llvm::Value *> &inputs,
-                Vector<llvm::Value *> &outputs,
+  CodeInterface(ArrayRef<llvm::Value *> inputs,
+                ArrayRef<llvm::Value *> outputs,
                 llvm::Value *context_ptr,
                 FunctionIRCache &function_ir_cache)
       : m_inputs(inputs),
diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
index 45b795dfca0..a88fa4f0a23 100644
--- a/source/blender/functions/backends/llvm/builder.cpp
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -32,7 +32,7 @@ static llvm::Function *create_wrapper_function(llvm::Module *module,
 
   llvm::Value *address_int = builder.getInt64((size_t)func_ptr);
   llvm::Value *address = builder.CreateIntToPtr(address_int, ftype->getPointerTo());
-  llvm::Value *result = builder.CreateCall(address, to_llvm_array_ref(args));
+  llvm::Value *result = builder.CreateCall(address, to_llvm(args));
 
   if (ftype->getReturnType() == builder.getVoidTy()) {
     builder.CreateRetVoid();
@@ -58,7 +58,7 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
     wrapper_function = create_wrapper_function(module, ftype, func_ptr, name);
   }
 
-  return m_builder.CreateCall(wrapper_function, to_llvm_array_ref(args));
+  return m_builder.CreateCall(wrapper_function, to_llvm(args));
 }
 
 llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
@@ -67,8 +67,7 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
                                             const char *function_name)
 {
   Vector<llvm::Type *> arg_types = this->types_of_values(args);
-  llvm::FunctionType *ftype = llvm::FunctionType::get(
-      return_type, to_llvm_array_ref(arg_types), false);
+  llvm::FunctionType *ftype = llvm::FunctionType::get(return_type, to_llvm(arg_types), false);
   return this->CreateCallPointer(func_ptr, ftype, args, function_name);
 }
 
@@ -115,7 +114,7 @@ void CodeBuilder::CreatePrintf(const char *format, ArrayRef<llvm::Value *> value
     }
     args.append(passed_arg);
   }
-  m_builder.CreateCall(printf_func, to_llvm_array_ref(args));
+  m_builder.CreateCall(printf_func, to_llvm(args));
 }
 
 static void print_stacktrace(ExecutionContext *context)
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index ae0601322cb..6026a47c82f 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -15,16 +15,21 @@ class IRConstruct_ForLoop;
 class IRConstruct_IterationsLoop;
 class IRConstruct_IfThenElse;
 
-template<typename T> static llvm::ArrayRef<T> to_llvm_array_ref(const Vector<T> &vector)
+template<typename T> static llvm::ArrayRef<T> to_llvm(const Vector<T> &vector)
 {
   return llvm::ArrayRef<T>(vector.begin(), vector.end());
 }
 
-template<typename T> static llvm::ArrayRef<T> to_llvm_array_ref(ArrayRef<T> array_ref)
+template<typename T> static llvm::ArrayRef<T> to_llvm(ArrayRef<T> array_ref)
 {
   return llvm::ArrayRef<T>(array_ref.begin(), array_ref.end());
 }
 
+inline llvm::StringRef to_llvm(StringRef string)
+{
+  return llvm::StringRef(string.begin(), string.size());
+}
+
 class CodeBuilder {
  private:
   llvm::IRBuilder<> m_builder;
@@ -107,12 +112,12 @@ class CodeBuilder {
 
   llvm::Type *getStructType(ArrayRef<llvm::Type *> types)
   {
-    return llvm::StructType::get(this->getContext(), to_llvm_array_ref(types));
+    return llvm::StructType::get(this->getContext(), to_llvm(types));
   }
 
   llvm::FunctionType *getFunctionType(llvm::Type *ret_type, ArrayRef<llvm::Type *> arg_types)
   {
-    return llvm::FunctionType::get(ret_type, to_llvm_array_ref(arg_types), false);
+    return llvm::FunctionType::get(ret_type, to_llvm(arg_types), false);
   }
 
   /* Value Builders
@@ -189,6 +194,13 @@ class CodeBuilder {
 
   Vector<llvm::Type *> types_of_values(ArrayRef<llvm::Value *> values);
 
+  llvm::Value *take_function_input(uint index, StringRef name)
+  {
+    llvm::Value *value = this->GetFunction()->arg_begin() + index;
+    value->setName(to_llvm(name));
+    return value;
+  }
+
   /* Instruction Builders
    **************************************/
 
@@ -319,6 +331,20 @@ class CodeBuilder {
     return m_builder.CreateLoad(addr);
   }
 
+  llvm::Value *CreateLoadAtIndex(llvm::Value *array_start_addr, uint index)
+  {
+    llvm::Value *addr = this->CreateConstGEP1_32(array_start_addr, index);
+    llvm::Value *value = this->CreateLoad(addr);
+    return value;
+  }
+
+  llvm::Value *CreateLoadAtIndex(llvm::Value *array_start_addr, llvm::Value *index)
+  {
+    llvm::Value *addr = this->CreateGEP(array_start_addr, index);
+    llvm::Value *value = this->CreateLoad(addr);
+    return value;
+  }
+
   void CreateStore(llvm::Value *value, llvm::Value *addr)
   {
     m_builder.CreateStore(value, addr, false);
@@ -359,7 +385,7 @@ class CodeBuilder {
 
   llvm::Value *CreateCall(llvm::Function *function, ArrayRef<llvm::Value *> args)
   {
-    return m_builder.CreateCall(function, to_llvm_array_ref(args));
+    return m_builder.CreateCall(function, to_llvm(args));
   }
 
   llvm::Value *CreateConstGEP1_32(llvm::Value *addr, uint index)
diff --git a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
index 2b27b43adcb..7b26ba8cecc 100644
--- a/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
@@ -5,8 +5,6 @@
 #include <llvm/Support/TargetSelect.h>
 #include <llvm/ExecutionEngine/ExecutionEngine.h>
 
-#include "context_pool.hpp"
-
 namespace FN {
 
 typedef std::function<void(
@@ -43,7 +41,7 @@ static llvm::Function *insert_tuple_call_function(SharedFunction &fn, llvm::Modu
   };
 
   llvm::FunctionType *function_type = llvm::FunctionType::get(
-      void_ty, to_llvm_array_ref(input_types), false);
+      void_ty, to_llvm(input_types), false);
 
   llvm::Function *function = llvm::Function::Create(
       function_type, llvm::GlobalValue::LinkageTypes::ExternalLinkage, fn->name().data(), module);



More information about the Bf-blender-cvs mailing list