[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