[Bf-blender-cvs] [771074d8488] functions: improve ir wrapper for tuple call
Jacques Lucke
noreply at git.blender.org
Tue Mar 5 16:47:36 CET 2019
Commit: 771074d848811e0387bf34927642d646c4bd5a2f
Author: Jacques Lucke
Date: Tue Mar 5 15:13:48 2019 +0100
Branches: functions
https://developer.blender.org/rB771074d848811e0387bf34927642d646c4bd5a2f
improve ir wrapper for tuple call
===================================================================
M source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
===================================================================
diff --git a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
index 09e1877eb5d..cd72e909190 100644
--- a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
@@ -5,30 +5,27 @@
namespace FN {
- static uint get_total_tuple_size(const SharedTupleMeta &meta)
+ static void run_TupleCallBody(
+ TupleCallBody *body,
+ SharedTupleMeta *meta_in_,
+ SharedTupleMeta *meta_out_,
+ void *data_in,
+ void *data_out)
{
- return sizeof(Tuple) + meta->total_data_size() + meta->element_amount() * sizeof(bool);
- }
+ SharedTupleMeta &meta_in = *meta_in_;
+ SharedTupleMeta &meta_out = *meta_out_;
- static void construct_tuple(void *dst, SharedTupleMeta *meta_)
- {
- SharedTupleMeta &meta = *meta_;
- void *data = ((char *)dst) + sizeof(Tuple);
- bool *initialized = (bool *)(((char *)data) + meta->total_data_size());
- new(dst) Tuple(meta, data, initialized, false);
- }
+ bool *initialized_in = (bool *)alloca(meta_in->element_amount());
+ bool *initialized_out = (bool *)alloca(meta_out->element_amount());
- static void call(TupleCallBody *body, Tuple *fn_in, Tuple *fn_out)
- {
- fn_in->set_all_initialized();
- fn_out->set_all_uninitialized();
- body->call(*fn_in, *fn_out);
- }
+ Tuple fn_in(meta_in, data_in, initialized_in, false);
+ Tuple fn_out(meta_out, data_out, initialized_out, false);
- static void destruct_tuple(Tuple *tuple)
- {
- tuple->set_all_uninitialized();
- tuple->~Tuple();
+ fn_in.set_all_initialized();
+ body->call(fn_in, fn_out);
+
+ /* This way the data is not freed with the tuples. */
+ fn_out.set_all_uninitialized();
}
class TupleCallLLVM : public LLVMBuildIRBody {
@@ -108,33 +105,20 @@ namespace FN {
llvm::Type *void_ptr_ty = void_ty->getPointerTo();
llvm::Type *byte_ptr_ty = llvm::Type::getInt8PtrTy(context);
- llvm::FunctionType *construct_ftype = llvm::FunctionType::get(
- void_ty, {byte_ptr_ty, void_ptr_ty}, false);
llvm::FunctionType *call_ftype = llvm::FunctionType::get(
- void_ty, {void_ptr_ty, byte_ptr_ty, byte_ptr_ty}, false);
- llvm::FunctionType *destruct_ftype = llvm::FunctionType::get(
- void_ty, {byte_ptr_ty}, false);
+ void_ty, {void_ptr_ty, void_ptr_ty, void_ptr_ty, byte_ptr_ty, byte_ptr_ty}, false);
- /* Construct input and output tuple on stack. */
- llvm::Value *tuple_in_ptr = alloca_bytes(builder, get_total_tuple_size(m_in_meta));
- tuple_in_ptr->setName("tuple_in");
- llvm::Value *tuple_out_ptr = alloca_bytes(builder, get_total_tuple_size(m_out_meta));
- tuple_out_ptr->setName("tuple_out");
- llvm::Value *tuple_in_data_ptr = builder.CreateConstGEP1_32(tuple_in_ptr, sizeof(Tuple));
+ /* Allocate temporary stack buffer for tuple input and output. */
+ llvm::Value *tuple_in_data_ptr = alloca_bytes(builder, m_in_meta->total_data_size());
tuple_in_data_ptr->setName("tuple_in_data");
- llvm::Value *tuple_out_data_ptr = builder.CreateConstGEP1_32(tuple_out_ptr, sizeof(Tuple));
+ llvm::Value *tuple_out_data_ptr = alloca_bytes(builder, m_out_meta->total_data_size());
tuple_out_data_ptr->setName("tuple_out_data");
llvm::Value *meta_in_ptr = void_ptr_to_ir(builder, (void *)&m_in_meta);
llvm::Value *meta_out_ptr = void_ptr_to_ir(builder, (void *)&m_out_meta);
- call_pointer(builder, (void *)construct_tuple,
- construct_ftype, {tuple_in_ptr, meta_in_ptr});
- call_pointer(builder, (void *)construct_tuple,
- construct_ftype, {tuple_out_ptr, meta_out_ptr});
-
- /* Write input values into tuple. */
+ /* Write input values into buffer. */
for (uint i = 0; i < input_type_infos.size(); i++) {
llvm::Value *arg = function->arg_begin() + i;
llvm::Value *store_at_addr = builder.CreateConstGEP1_32(tuple_in_data_ptr, m_in_meta->offsets()[i]);
@@ -142,10 +126,15 @@ namespace FN {
}
/* Execute tuple call body. */
- call_pointer(builder, (void *)call,
- call_ftype, {void_ptr_to_ir(builder, m_tuple_call), tuple_in_ptr, tuple_out_ptr});
-
- /* Read output values into struct and return. */
+ call_pointer(builder, (void *)run_TupleCallBody,
+ call_ftype,
+ {void_ptr_to_ir(builder, m_tuple_call),
+ meta_in_ptr,
+ meta_out_ptr,
+ tuple_in_data_ptr,
+ tuple_out_data_ptr});
+
+ /* Read output values from buffer. */
llvm::Value *output = llvm::UndefValue::get(output_type);
for (uint i = 0; i < output_type_infos.size(); i++) {
llvm::Value *load_from_addr = builder.CreateConstGEP1_32(tuple_out_data_ptr, m_out_meta->offsets()[i]);
@@ -153,12 +142,6 @@ namespace FN {
output = builder.CreateInsertValue(output, out, i);
}
- /* Destruct tuples */
- call_pointer(builder, (void *)destruct_tuple,
- destruct_ftype, {tuple_in_ptr});
- call_pointer(builder, (void *)destruct_tuple,
- destruct_ftype, {tuple_out_ptr});
-
builder.CreateRet(output);
}
};
More information about the Bf-blender-cvs
mailing list