[Bf-blender-cvs] [6e652a42fc0] functions: splitup llvm vectorization into multiple methods

Jacques Lucke noreply at git.blender.org
Wed May 1 19:32:10 CEST 2019


Commit: 6e652a42fc04565ce94d5f139696397a726d7ef8
Author: Jacques Lucke
Date:   Wed May 1 19:26:51 2019 +0200
Branches: functions
https://developer.blender.org/rB6e652a42fc04565ce94d5f139696397a726d7ef8

splitup llvm vectorization into multiple methods

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

M	source/blender/functions/functions/auto_vectorization.cpp

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

diff --git a/source/blender/functions/functions/auto_vectorization.cpp b/source/blender/functions/functions/auto_vectorization.cpp
index 6914e032e49..8a503a37246 100644
--- a/source/blender/functions/functions/auto_vectorization.cpp
+++ b/source/blender/functions/functions/auto_vectorization.cpp
@@ -64,98 +64,139 @@ class AutoVectorizationGen : public LLVMBuildIRBody {
                 CodeInterface &interface,
                 const BuildIRSettings &settings) const override
   {
-    LLVMValues input_list_lengths;
+    LLVMValues input_list_lengths = this->get_input_list_lengths(builder, interface);
+    llvm::Value *max_length = builder.CreateSIntMax(input_list_lengths);
+
+    LLVMValues input_data_pointers = this->get_input_data_pointers(builder, interface);
+    LLVMValues output_data_pointers = this->create_output_lists(builder, interface, max_length);
+
+    auto *setup_block = builder.GetInsertBlock();
+    auto *condition_block = builder.NewBlockInFunction("Loop Condition");
+    auto *body_block = builder.NewBlockInFunction("Loop Body");
+    auto *end_block = builder.NewBlockInFunction("Loop End");
+
+    builder.CreateBr(condition_block);
+
+    CodeBuilder body_builder(body_block);
+    CodeBuilder condition_builder(condition_block);
+
+    auto *iteration = condition_builder.CreatePhi(condition_builder.getInt32Ty(), 2);
+    auto *condition = condition_builder.CreateICmpULT(iteration, max_length);
+    condition_builder.CreateCondBr(condition, body_block, end_block);
+
+    LLVMValues main_inputs = this->prepare_main_function_inputs(
+        body_builder, interface, input_data_pointers, iteration);
+
+    LLVMValues main_outputs(m_output_info.size());
+    CodeInterface main_interface(
+        main_inputs, main_outputs, interface.context_ptr(), interface.function_ir_cache());
+    auto *body = m_main->body<LLVMBuildIRBody>();
+    body->build_ir(body_builder, main_interface, settings);
+
+    this->store_computed_values_in_output_lists(
+        body_builder, main_outputs, output_data_pointers, iteration);
+
+    llvm::Value *next_iteration = body_builder.CreateIAdd(iteration, body_builder.getInt32(1));
+    body_builder.CreateBr(condition_block);
+
+    iteration->addIncoming(condition_builder.getInt32(0), setup_block);
+    iteration->addIncoming(next_iteration, body_block);
+
+    builder.SetInsertPoint(end_block);
+    this->free_input_lists(builder, interface);
+  }
+
+ private:
+  LLVMValues get_input_list_lengths(CodeBuilder &builder, CodeInterface &interface) const
+  {
+    LLVMValues list_lengths;
     for (uint i = 0; i < m_input_info.size(); i++) {
       if (m_input_info[i].is_list) {
         auto *length = builder.CreateCallPointer(
             (void *)m_input_info[i].get_length_fn, {interface.get_input(i)}, builder.getInt32Ty());
-        input_list_lengths.append(length);
+        list_lengths.append(length);
       }
     }
+    return list_lengths;
+  }
 
-    llvm::Value *max_length = builder.CreateSIntMax(input_list_lengths);
-
-    LLVMValues input_data_pointers;
+  LLVMValues get_input_data_pointers(CodeBuilder &builder, CodeInterface &interface) const
+  {
+    LLVMValues data_pointers;
     for (uint i = 0; i < m_input_info.size(); i++) {
       if (m_input_info[i].is_list) {
         uint stride = m_input_info[i].base_cpp_type->size_of_type();
         llvm::Value *data_ptr = builder.CreateCallPointer_RetVoidPtr(
             (void *)m_input_info[i].get_data_ptr_fn, {interface.get_input(i)});
         llvm::Value *typed_data_ptr = builder.CastToPointerWithStride(data_ptr, stride);
-        input_data_pointers.append(typed_data_ptr);
+        data_pointers.append(typed_data_ptr);
       }
     }
+    return data_pointers;
+  }
 
-    LLVMValues output_data_pointers;
+  LLVMValues create_output_lists(CodeBuilder &builder,
+                                 CodeInterface &interface,
+                                 llvm::Value *length) const
+  {
+    LLVMValues data_pointers;
     for (uint i = 0; i < m_output_info.size(); i++) {
       uint stride = m_output_info[i].base_cpp_type->size_of_type();
 
       llvm::Value *output_list = builder.CreateCallPointer_RetVoidPtr(
-          (void *)m_output_info[i].get_new_list_fn, {max_length});
+          (void *)m_output_info[i].get_new_list_fn, {length});
       llvm::Value *data_ptr = builder.CreateCallPointer_RetVoidPtr(
           (void *)m_output_info[i].get_data_ptr_fn, {output_list});
       llvm::Value *typed_data_ptr = builder.CastToPointerWithStride(data_ptr, stride);
-      output_data_pointers.append(typed_data_ptr);
+      data_pointers.append(typed_data_ptr);
       interface.set_output(i, output_list);
     }
+    return data_pointers;
+  }
 
-    auto *setup_block = builder.GetInsertBlock();
-    auto *condition_block = builder.NewBlockInFunction("Loop Condition");
-    auto *body_block = builder.NewBlockInFunction("Loop Body");
-    auto *end_block = builder.NewBlockInFunction("Loop End");
-
-    builder.CreateBr(condition_block);
-
-    CodeBuilder body_builder(body_block);
-    CodeBuilder condition_builder(condition_block);
-    CodeBuilder end_builder(end_block);
-
-    auto *iteration = condition_builder.CreatePhi(condition_builder.getInt32Ty(), 2);
-    auto *condition = condition_builder.CreateICmpULT(iteration, max_length);
-    condition_builder.CreateCondBr(condition, body_block, end_block);
+  void store_computed_values_in_output_lists(CodeBuilder &builder,
+                                             const LLVMValues &computed_values,
+                                             const LLVMValues &output_data_pointers,
+                                             llvm::Value *iteration) const
+  {
+    for (uint i = 0; i < m_output_info.size(); i++) {
+      llvm::Value *store_address = builder.CreateGEP(output_data_pointers[i], iteration);
+      m_output_info[i].base_llvm_type->build_store_ir__relocate(
+          builder, computed_values[i], store_address);
+    }
+  }
 
+  LLVMValues prepare_main_function_inputs(CodeBuilder &builder,
+                                          CodeInterface &interface,
+                                          const LLVMValues &input_data_pointers,
+                                          llvm::Value *iteration) const
+  {
     LLVMValues main_inputs;
 
     uint list_input_index = 0;
     for (uint i = 0; i < m_input_info.size(); i++) {
       if (m_input_is_list[i]) {
 
-        llvm::Value *load_address = body_builder.CreateGEP(input_data_pointers[list_input_index],
-                                                           iteration);
+        llvm::Value *load_address = builder.CreateGEP(input_data_pointers[list_input_index],
+                                                      iteration);
         // TODO: handle different lengths
         llvm::Value *value_for_main = m_input_info[i].base_llvm_type->build_load_ir__relocate(
-            body_builder, load_address);
+            builder, load_address);
         main_inputs.append(value_for_main);
         list_input_index++;
       }
       else {
         llvm::Value *source_value = interface.get_input(i);
-        llvm::Value *value_for_main = m_input_info[i].base_llvm_type->build_copy_ir(body_builder,
+        llvm::Value *value_for_main = m_input_info[i].base_llvm_type->build_copy_ir(builder,
                                                                                     source_value);
         main_inputs.append(value_for_main);
       }
     }
+    return main_inputs;
+  }
 
-    LLVMValues main_outputs(m_output_info.size());
-    CodeInterface main_interface(
-        main_inputs, main_outputs, interface.context_ptr(), interface.function_ir_cache());
-    auto *body = m_main->body<LLVMBuildIRBody>();
-    body->build_ir(body_builder, main_interface, settings);
-
-    for (uint i = 0; i < m_output_info.size(); i++) {
-      llvm::Value *store_address = body_builder.CreateGEP(output_data_pointers[i], iteration);
-      m_output_info[i].base_llvm_type->build_store_ir__relocate(
-          body_builder, main_outputs[i], store_address);
-    }
-
-    llvm::Value *next_iteration = body_builder.CreateIAdd(iteration, body_builder.getInt32(1));
-    body_builder.CreateBr(condition_block);
-
-    iteration->addIncoming(condition_builder.getInt32(0), setup_block);
-    iteration->addIncoming(next_iteration, body_block);
-
-    builder.SetInsertPoint(end_block);
-
+  void free_input_lists(CodeBuilder &builder, CodeInterface &interface) const
+  {
     for (uint i = 0; i < m_input_info.size(); i++) {
       if (m_input_info[i].is_list) {
         llvm::Value *input_list = interface.get_input(i);



More information about the Bf-blender-cvs mailing list