[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