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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to