[Bf-blender-cvs] [ded2b50] object_nodes: Move the node-output-to-value map into compiler subclasses.

Lukas Tönne noreply at git.blender.org
Sat May 28 11:31:04 CEST 2016


Commit: ded2b507a10234fd39d6c07dd241fc44440d3079
Author: Lukas Tönne
Date:   Sat May 28 11:29:01 2016 +0200
Branches: object_nodes
https://developer.blender.org/rBded2b507a10234fd39d6c07dd241fc44440d3079

Move the node-output-to-value map into compiler subclasses.

This is in preparation for specializing the value types of compiler implementations,
so that we can replace dual struct types with independent llvm values.

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

M	source/blender/blenvm/llvm/llvm_compiler.cc
M	source/blender/blenvm/llvm/llvm_compiler.h
M	source/blender/blenvm/llvm/llvm_compiler_dual.cc
M	source/blender/blenvm/llvm/llvm_compiler_simple.cc

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

diff --git a/source/blender/blenvm/llvm/llvm_compiler.cc b/source/blender/blenvm/llvm/llvm_compiler.cc
index cc015ea..98712bd 100644
--- a/source/blender/blenvm/llvm/llvm_compiler.cc
+++ b/source/blender/blenvm/llvm/llvm_compiler.cc
@@ -114,6 +114,8 @@ llvm::BasicBlock *LLVMCompilerBase::codegen_function_body_expression(const NodeG
 {
 	using namespace llvm;
 	
+	node_graph_begin();
+	
 	IRBuilder<> builder(context());
 	
 	BasicBlock *block = BasicBlock::Create(context(), "entry", func);
@@ -158,7 +160,7 @@ llvm::BasicBlock *LLVMCompilerBase::codegen_function_body_expression(const NodeG
 	
 	builder.CreateRetVoid();
 	
-	m_output_values.clear();
+	node_graph_end();
 	
 	return block;
 }
@@ -242,24 +244,6 @@ void LLVMCompilerBase::optimize_function(llvm::Function *func, int opt_level)
 	FPM.run(*func);
 }
 
-void LLVMCompilerBase::map_argument(llvm::BasicBlock *block, const OutputKey &output, llvm::Argument *arg)
-{
-	m_output_values[output] = arg;
-	UNUSED_VARS(block);
-}
-
-void LLVMCompilerBase::store_return_value(llvm::BasicBlock *block, const OutputKey &output, llvm::Value *arg)
-{
-	using namespace llvm;
-	
-	IRBuilder<> builder(context());
-	builder.SetInsertPoint(block);
-	
-	Value *value = m_output_values.at(output);
-	Value *rvalue = builder.CreateLoad(value);
-	builder.CreateStore(rvalue, arg);
-}
-
 void LLVMCompilerBase::expand_pass_node(llvm::BasicBlock *block, const NodeInstance *node)
 {
 	using namespace llvm;
@@ -274,18 +258,14 @@ void LLVMCompilerBase::expand_pass_node(llvm::BasicBlock *block, const NodeInsta
 	ConstOutputKey output = node->output(0);
 	BLI_assert(input.value_type() == INPUT_EXPRESSION);
 	
-	Value *value = m_output_values.at(input.link());
-	bool ok = m_output_values.insert(OutputValueMap::value_type(output, value)).second;
-	BLI_assert(ok && "Value for node output already defined!");
-	UNUSED_VARS(ok);
+	copy_node_value(input.link(), output);
 }
 
 void LLVMCompilerBase::expand_argument_node(llvm::BasicBlock *block, const NodeInstance *node)
 {
 	using namespace llvm;
 	/* input arguments are mapped in advance */
-	BLI_assert(m_output_values.find(node->output(0)) != m_output_values.end() &&
-	           "Input argument value node mapped!");
+	BLI_assert(has_node_value(node->output(0)) && "Input argument value node mapped!");
 	UNUSED_VARS(block, node);
 }
 
@@ -306,54 +286,23 @@ void LLVMCompilerBase::expand_function_node(llvm::BasicBlock *block, const NodeI
 	
 	for (int i = 0; i < node->num_outputs(); ++i) {
 		ConstOutputKey output = node->output(i);
-		const TypeSpec *typespec = output.socket->typedesc.get_typespec();
-		Type *type = get_value_type(typespec, false);
-		BLI_assert(type != NULL);
-		Value *value = builder.CreateAlloca(type);
-		
-		args.push_back(value);
 		
-		/* use as node output values */
-		bool ok = m_output_values.insert(OutputValueMap::value_type(output, value)).second;
-		BLI_assert(ok && "Value for node output already defined!");
-		UNUSED_VARS(ok);
+		alloc_node_value(block, output);
+		append_output_arguments(args, output);
 	}
 	
 	/* set input arguments */
 	for (int i = 0; i < node->num_inputs(); ++i) {
 		ConstInputKey input = node->input(i);
 		const TypeSpec *typespec = input.socket->typedesc.get_typespec();
-		bool is_constant = (input.value_type() == INPUT_CONSTANT);
 		
 		switch (input.value_type()) {
 			case INPUT_CONSTANT: {
-				/* create storage for the global value */
-				Constant *cvalue = create_node_value_constant(input.value());
-				
-				Value *value;
-				if (use_argument_pointer(typespec, is_constant)) {
-					AllocaInst *pvalue = builder.CreateAlloca(cvalue->getType());
-					builder.CreateStore(cvalue, pvalue);
-					value = pvalue;
-				}
-				else {
-					value = cvalue;
-				}
-				
-				args.push_back(value);
+				append_input_constant(block, args, typespec, input.value());
 				break;
 			}
 			case INPUT_EXPRESSION: {
-				Value *pvalue = m_output_values.at(input.link());
-				Value *value;
-				if (use_argument_pointer(typespec, is_constant)) {
-					value = pvalue;
-				}
-				else {
-					value = builder.CreateLoad(pvalue);
-				}
-				
-				args.push_back(value);
+				append_input_value(block, args, typespec, input.link());
 				break;
 			}
 			case INPUT_VARIABLE: {
diff --git a/source/blender/blenvm/llvm/llvm_compiler.h b/source/blender/blenvm/llvm/llvm_compiler.h
index f543108..6f58369 100644
--- a/source/blender/blenvm/llvm/llvm_compiler.h
+++ b/source/blender/blenvm/llvm/llvm_compiler.h
@@ -65,8 +65,6 @@ struct TypeDesc;
 struct FunctionLLVM;
 
 struct LLVMCompilerBase {
-	typedef std::map<ConstOutputKey, llvm::Value*> OutputValueMap;
-	
 	virtual ~LLVMCompilerBase();
 	
 	FunctionLLVM *compile_function(const string &name, const NodeGraph &graph, int opt_level);
@@ -88,19 +86,28 @@ protected:
 	llvm::BasicBlock *codegen_function_body_expression(const NodeGraph &graph, llvm::Function *func);
 	llvm::Function *codegen_node_function(const string &name, const NodeGraph &graph);
 	
-	void map_argument(llvm::BasicBlock *block, const OutputKey &output, llvm::Argument *arg);
-	void store_return_value(llvm::BasicBlock *block, const OutputKey &output, llvm::Value *arg);
-	
 	void expand_pass_node(llvm::BasicBlock *block, const NodeInstance *node);
 	void expand_argument_node(llvm::BasicBlock *block, const NodeInstance *node);
 	void expand_function_node(llvm::BasicBlock *block, const NodeInstance *node);
 	llvm::FunctionType *get_node_function_type(const std::vector<llvm::Type*> &inputs,
 	                                           const std::vector<llvm::Type*> &outputs);
 	
+	virtual void node_graph_begin() = 0;
+	virtual void node_graph_end() = 0;
+	
+	virtual bool has_node_value(const ConstOutputKey &output) const = 0;
+	virtual void alloc_node_value(llvm::BasicBlock *block, const ConstOutputKey &output) = 0;
+	virtual void copy_node_value(const ConstOutputKey &from, const ConstOutputKey &to) = 0;
+	virtual void append_output_arguments(std::vector<llvm::Value*> &args, const ConstOutputKey &output) = 0;
+	virtual void append_input_value(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                                const TypeSpec *typespec, const ConstOutputKey &link) = 0;
+	virtual void append_input_constant(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                                   const TypeSpec *typespec, const NodeConstant *node_value) = 0;
+	virtual void map_argument(llvm::BasicBlock *block, const OutputKey &output, llvm::Argument *arg) = 0;
+	virtual void store_return_value(llvm::BasicBlock *block, const OutputKey &output, llvm::Value *arg) = 0;
+	
 	virtual llvm::Type *get_value_type(const TypeSpec *spec, bool is_constant) = 0;
-	virtual bool use_argument_pointer(const TypeSpec *typespec, bool is_constant) = 0;
-
-	virtual llvm::Constant *create_node_value_constant(const NodeConstant *node_value) = 0;
+	virtual bool use_argument_pointer(const TypeSpec *typespec, bool is_constant) const = 0;
 	
 	llvm::Function *declare_node_function(llvm::Module *mod, const NodeType *nodetype);
 	virtual void define_nodes_module() = 0;
@@ -108,26 +115,56 @@ protected:
 	
 private:
 	llvm::Module *m_module;
-	OutputValueMap m_output_values;
 };
 
 struct LLVMSimpleCompilerImpl : public LLVMCompilerBase {
+	typedef std::map<ConstOutputKey, llvm::Value*> OutputValueMap;
+	
+	void node_graph_begin();
+	void node_graph_end();
+	
+	bool has_node_value(const ConstOutputKey &output) const;
+	void alloc_node_value(llvm::BasicBlock *block, const ConstOutputKey &output);
+	void copy_node_value(const ConstOutputKey &from, const ConstOutputKey &to);
+	void append_output_arguments(std::vector<llvm::Value*> &args, const ConstOutputKey &output);
+	void append_input_value(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                            const TypeSpec *typespec, const ConstOutputKey &link);
+	void append_input_constant(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                           const TypeSpec *typespec, const NodeConstant *node_value);
+	void map_argument(llvm::BasicBlock *block, const OutputKey &output, llvm::Argument *arg);
+	void store_return_value(llvm::BasicBlock *block, const OutputKey &output, llvm::Value *arg);
+	
 	llvm::Type *get_value_type(const TypeSpec *spec, bool is_constant);
 	
 	llvm::Module *get_nodes_module() const { return m_nodes_module; }
 	
-	bool use_argument_pointer(const TypeSpec *typespec, bool is_constant);
-	
-	llvm::Constant *create_node_value_constant(const NodeConstant *node_value);
+	bool use_argument_pointer(const TypeSpec *typespec, bool is_constant) const;
 	
 	bool set_node_function_impl(OpCode op, const NodeType *nodetype, llvm::Function *func);
 	void define_nodes_module();
 	
 private:
 	static llvm::Module *m_nodes_module;
+	OutputValueMap m_output_values;
 };
 
 struct LLVMTextureCompiler : public LLVMCompilerBase {
+	typedef std::map<ConstOutputKey, llvm::Value*> OutputValueMap;
+	
+	void node_graph_begin();
+	void node_graph_end();
+	
+	bool has_node_value(const ConstOutputKey &output) const;
+	void alloc_node_value(llvm::BasicBlock *block, const ConstOutputKey &output);
+	void copy_node_value(const ConstOutputKey &from, const ConstOutputKey &to);
+	void append_output_arguments(std::vector<llvm::Value*> &args, const ConstOutputKey &output);
+	void append_input_value(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                            const TypeSpec *typespec, const ConstOutputKey &link);
+	void append_input_constant(llvm::BasicBlock *block, std::vector<llvm::Value*> &args,
+	                           const TypeSpec *typespec, const NodeConstant *node_value);
+	void map_argument(llvm::BasicBlock *block, const OutputKey &output, llvm::Argument *arg);
+	void store_return_value(llvm::BasicBlock *block, const OutputKey &output, llvm::Value *arg);
+	
 	llvm::Type *get_value_type(const TypeSpec *spec, bool is_constant);
 	llvm::Function *declare_elementary_node_function(
 	        llvm::Module *mod, const NodeType *nodetype, const string &name,
@@ -135,10 +172,8 @@ struct LLVMTextureCompiler : public LLVMCompilerBase {
 	
 	llvm::Module *get_nodes_module() const { return m_nodes_module; }
 	
-	bool use_argument_pointer(const TypeSpe

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list