[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