[Bf-blender-cvs] [cdf4591edbe] functions: Improve interface of IR generators and wrap IRBuilder<>

Jacques Lucke noreply at git.blender.org
Thu Mar 28 12:49:15 CET 2019


Commit: cdf4591edbecfbec4ad9a0794d4c44194291ebf6
Author: Jacques Lucke
Date:   Thu Mar 28 12:47:29 2019 +0100
Branches: functions
https://developer.blender.org/rBcdf4591edbecfbec4ad9a0794d4c44194291ebf6

Improve interface of IR generators and wrap IRBuilder<>

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_llvm.hpp
M	source/blender/functions/backends/llvm/build_ir_body.hpp
A	source/blender/functions/backends/llvm/builder.cpp
A	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/backends/llvm/compiled_body.cpp
M	source/blender/functions/backends/llvm/compiled_body.hpp
M	source/blender/functions/backends/llvm/fgraph_ir_generation.cpp
M	source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
M	source/blender/functions/backends/llvm/ir_to_tuple_call.cpp
D	source/blender/functions/backends/llvm/ir_utils.cpp
D	source/blender/functions/backends/llvm/ir_utils.hpp
M	source/blender/functions/backends/llvm/llvm_types.cpp
M	source/blender/functions/backends/llvm/llvm_types.hpp
M	source/blender/functions/frontends/data_flow_nodes/function_generation.cpp
M	source/blender/functions/functions/scalar_math.cpp
M	source/blender/functions/functions/vectors.cpp
M	source/blender/functions/types/boolean.cpp
M	source/blender/functions/types/numeric_lists.cpp

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 41b591076f5..4ac1189eb4b 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -76,10 +76,10 @@ set(SRC
 	backends/llvm/compiled_body.cpp
 	backends/llvm/compile.hpp
 	backends/llvm/compile.cpp
-	backends/llvm/ir_utils.hpp
-	backends/llvm/ir_utils.cpp
 	backends/llvm/fgraph_ir_generation.hpp
 	backends/llvm/fgraph_ir_generation.cpp
+	backends/llvm/builder.hpp
+	backends/llvm/builder.cpp
 
 	types/lists.hpp
 	types/numeric_lists.hpp
diff --git a/source/blender/functions/FN_llvm.hpp b/source/blender/functions/FN_llvm.hpp
index 6cc0e069212..e4c63d4beef 100644
--- a/source/blender/functions/FN_llvm.hpp
+++ b/source/blender/functions/FN_llvm.hpp
@@ -6,4 +6,5 @@
 #include "backends/llvm/ir_to_tuple_call.hpp"
 #include "backends/llvm/ir_for_tuple_call.hpp"
 #include "backends/llvm/compiled_body.hpp"
-#include "backends/llvm/fgraph_ir_generation.hpp"
\ No newline at end of file
+#include "backends/llvm/fgraph_ir_generation.hpp"
+#include "backends/llvm/builder.hpp"
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/build_ir_body.hpp b/source/blender/functions/backends/llvm/build_ir_body.hpp
index 62e07912558..742baac849d 100644
--- a/source/blender/functions/backends/llvm/build_ir_body.hpp
+++ b/source/blender/functions/backends/llvm/build_ir_body.hpp
@@ -1,12 +1,37 @@
 #pragma once
 
-#include "FN_core.hpp"
-#include <llvm/IR/IRBuilder.h>
+#include "builder.hpp"
 
 namespace FN {
 
-	using LLVMValues = SmallVector<llvm::Value *>;
-	using LLVMTypes = BLI::SmallVector<llvm::Type *>;
+	class BuildIRSettings {
+
+	};
+
+	class CodeInterface {
+	private:
+		LLVMValues &m_inputs;
+		LLVMValues &m_outputs;
+
+	public:
+		CodeInterface(LLVMValues &inputs, LLVMValues &outputs)
+			: m_inputs(inputs), m_outputs(outputs) {}
+
+		llvm::Value *get_input(uint index)
+		{
+			return m_inputs[index];
+		}
+
+		void set_output(uint index, llvm::Value *value)
+		{
+			m_outputs[index] = value;
+		}
+
+		const LLVMValues &inputs()
+		{
+			return m_inputs;
+		}
+	};
 
 	class LLVMBuildIRBody : public FunctionBody {
 	public:
@@ -15,9 +40,9 @@ namespace FN {
 		virtual ~LLVMBuildIRBody() {};
 
 		virtual void build_ir(
-			llvm::IRBuilder<> &builder,
-			const LLVMValues &inputs,
-			LLVMValues &r_outputs) const = 0;
+			CodeBuilder &builder,
+			CodeInterface &interface,
+			const BuildIRSettings &settings) const = 0;
 	};
 
 }
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
new file mode 100644
index 00000000000..ce5bec98026
--- /dev/null
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -0,0 +1,14 @@
+#include "builder.hpp"
+
+namespace FN {
+
+	LLVMTypes CodeBuilder::types_of_values(const LLVMValues &values)
+	{
+		LLVMTypes types;
+		for (llvm::Value *value : values) {
+			types.append(value->getType());
+		}
+		return types;
+	}
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
new file mode 100644
index 00000000000..b599e257af1
--- /dev/null
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -0,0 +1,200 @@
+#pragma once
+
+#include "FN_core.hpp"
+#include <llvm/IR/IRBuilder.h>
+
+namespace FN {
+
+	using LLVMValues = SmallVector<llvm::Value *>;
+	using LLVMTypes = BLI::SmallVector<llvm::Type *>;
+	class LLVMTypeInfo;
+
+	template<typename T>
+	static llvm::ArrayRef<T> to_array_ref(const SmallVector<T> &vector)
+	{
+		return llvm::ArrayRef<T>(vector.begin(), vector.end());
+	}
+
+
+	class CodeBuilder {
+	private:
+		llvm::IRBuilder<> m_builder;
+
+	public:
+		CodeBuilder(llvm::IRBuilder<> &builder)
+			: m_builder(builder) {}
+
+		CodeBuilder(llvm::BasicBlock *bb)
+			: m_builder(bb) {}
+
+		/* Getters
+		 ***************************************/
+
+		llvm::LLVMContext &getContext()
+		{
+			return m_builder.getContext();
+		}
+
+		llvm::Module *getModule()
+		{
+			return m_builder.GetInsertBlock()->getModule();
+		}
+
+		llvm::BasicBlock *GetInsertBlock()
+		{
+			return m_builder.GetInsertBlock();
+		}
+
+		llvm::Type *getVoidTy()
+		{
+			return m_builder.getVoidTy();
+		}
+
+		llvm::Type *getVoidPtrTy()
+		{
+			return this->getVoidTy()->getPointerTo();
+		}
+
+		llvm::Type *getVoidPtrPtrTy()
+		{
+			return this->getVoidPtrTy()->getPointerTo();
+		}
+
+		llvm::Type *getFixedSizeType(uint size)
+		{
+			return llvm::ArrayType::get(m_builder.getInt8Ty(), size);
+		}
+
+
+		/* Value Builders
+		 **************************************/
+
+		llvm::Value *getVoidPtr(void *ptr)
+		{
+			return this->getPtr(ptr, this->getVoidPtrTy());
+		}
+
+		llvm::Value *getPtr(void *ptr, llvm::Type *ptr_type)
+		{
+			llvm::Value *ptr_value = m_builder.getInt64((size_t)ptr);
+			return m_builder.CreateIntToPtr(ptr_value, ptr_type);
+		}
+
+		llvm::Value *getInt64(int64_t value)
+		{
+			return m_builder.getInt64(value);
+		}
+
+
+		/* Misc
+		 **************************************/
+
+		LLVMTypes types_of_values(const LLVMValues &values);
+
+
+		/* Instruction Builders
+		 **************************************/
+
+		void CreateRet(llvm::Value *value)
+		{
+			m_builder.CreateRet(value);
+		}
+
+		void CreateRetVoid()
+		{
+			m_builder.CreateRetVoid();
+		}
+
+		llvm::Value *CreateCastIntTo8(llvm::Value *value, bool is_signed)
+		{
+			return m_builder.CreateIntCast(value, m_builder.getInt8Ty(), is_signed);
+		}
+
+		llvm::Value *CreateCastIntTo1(llvm::Value *value)
+		{
+			return m_builder.CreateIntCast(value, m_builder.getInt1Ty(), false);
+		}
+
+		llvm::Value *CreateFAdd(llvm::Value *a, llvm::Value *b)
+		{
+			return m_builder.CreateFAdd(a, b);
+		}
+
+		llvm::Value *CreateAllocaBytes_VoidPtr(uint amount)
+		{
+			llvm::Type *size_type = this->getFixedSizeType(amount);
+			llvm::Value *addr = m_builder.CreateAlloca(size_type);
+			return this->CastToVoidPtr(addr);
+		}
+
+		llvm::Value *CreateAllocaBytes_BytePtr(uint amount)
+		{
+			llvm::Type *size_type = this->getFixedSizeType(amount);
+			llvm::Value *addr = m_builder.CreateAlloca(size_type);
+			return this->CastToBytePtr(addr);
+		}
+
+		llvm::Value *CastToPointerOf(llvm::Value *addr, llvm::Type *base_type)
+		{
+			return m_builder.CreatePointerCast(addr, base_type->getPointerTo());
+		}
+
+		llvm::Value *CastToVoidPtr(llvm::Value *addr)
+		{
+			return m_builder.CreatePointerCast(addr, this->getVoidPtrTy());
+		}
+
+		llvm::Value *CastToBytePtr(llvm::Value *addr)
+		{
+			return m_builder.CreatePointerCast(addr, m_builder.getInt8PtrTy());
+		}
+
+		llvm::Value *CreateLoad(llvm::Value *addr)
+		{
+			return m_builder.CreateLoad(addr);
+		}
+
+		void CreateStore(llvm::Value *value, llvm::Value *addr)
+		{
+			m_builder.CreateStore(value, addr, false);
+		}
+
+		llvm::Value *CreateExtractValue(llvm::Value *aggregate, uint index)
+		{
+			return m_builder.CreateExtractValue(aggregate, index);
+		}
+
+		llvm::Value *CreateInsertValue(llvm::Value *aggregate, llvm::Value *value, uint index)
+		{
+			return m_builder.CreateInsertValue(aggregate, value, index);
+		}
+
+		llvm::Value *CreateCallPointer(
+			void *func_ptr,
+			llvm::FunctionType *ftype,
+			const LLVMValues &args)
+		{
+			auto address_int = m_builder.getInt64((size_t)func_ptr);
+			auto address = m_builder.CreateIntToPtr(address_int, ftype->getPointerTo());
+			return m_builder.CreateCall(address, to_array_ref(args));
+		}
+
+		llvm::Value *CreateCall(
+			llvm::Function *function,
+			const LLVMValues &args)
+		{
+			return m_builder.CreateCall(function, to_array_ref(args));
+		}
+
+		llvm::Value *CreateConstGEP1_32(llvm::Value *addr, uint index)
+		{
+			return m_builder.CreateConstGEP1_32(addr, index);
+		}
+
+		llvm::Value *CreateGEP(llvm::Value *addr, llvm::Value *index)
+		{
+			return m_builder.CreateGEP(addr, index);
+		}
+	};
+
+} /* namespace FN */
\ No newline at end of file
diff --git a/source/blender/functions/backends/llvm/compiled_body.cpp b/source/blender/functions/backends/llvm/compiled_body.cpp
index 614b5f5a51a..1345a4a91e8 100644
--- a/source/blender/functions/backends/llvm/compiled_body.cpp
+++ b/source/blender/functions/backends/llvm/compiled_body.cpp
@@ -1,5 +1,4 @@
 #include "FN_llvm.hpp"
-#include "ir_utils.hpp"
 
 #include <llvm/IR/Verifier.h>
 #include <llvm/ExecutionEngine/ExecutionEngine.h>
@@ -9,21 +8,17 @@ namespace FN {
 	BLI_COMPOSITION_IMPLEMENTATION(LLVMCompiledBody);
 
 	void LLVMCompiledBody::build_ir(
-		llvm::IRBuilder<> &builder,
-		const LLVMValues &inputs,
-		LLVMValues &r_outputs) const
+		CodeBuilder &builder,
+		CodeInterface &interface,
+		const BuildIRSettings &UNUSED(settings)) const
 	{
 		auto *ftype = function_type_from_signature(
 			this->owner()->signature(), builder.getContext());
 
-		llvm::Value *output_struct = call_pointer(
-			builder,
-			this->function_ptr(),
-			ftype,
-			inputs);
+		llvm::Value *output_struct = builder.CreateCallPointer(this->function_ptr(), ftype, interface.inputs());
 		for (uint i = 0; i < ftype->getReturnType()->getStructNumElements(); i++) {
 			llvm::Value *out = builder.CreateExtractValue(output_struct, i);
-			r_outputs.append(out);
+			interface.set_output(i, out);
 		}
 	}
 
@@ -55,14 +50,15 @@ namespace FN {
 		}
 
 		llvm::BasicBlock *bb = llvm::BasicBlock::Create(context, "entry", function);
-		llvm::IRBuilder<> builder(bb);
+		CodeBuilder builder(bb);
 
 		LLVMBuildIRBody *gen_body = fn->body<LLVMBuildIRBody>();
 		BLI_assert(gen_body);
 
-		LLVMValues output_values;
-		gen_body->build_ir(builder, input_values, output_values);
-		BLI_assert(output_values.size() == output_types.size());
+		LLVMValues output_values(output_types.size());
+		BuildIRSettings settings;
+		CodeInterface interface(input_values, output_values);
+		gen_body->build_ir(builder, interface, settings);
 
 		llvm::Value *return_value = llvm::UndefValue::get(output_type);
 		for (uint i = 0; i < output_values.size(); i++) {
diff --git a/source/blender/functions/backends/llvm/compiled_body.hpp b/source/blender/functions/backends/llvm/compiled_body.hpp
index 0a531bd5e07..4c2136a81e4 100644
--

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list