[Bf-blender-cvs] [5fe4ad93bcf] functions: more specialized iterations loop builder

Jacques Lucke noreply at git.blender.org
Mon May 13 10:16:29 CEST 2019


Commit: 5fe4ad93bcf25fece85b2212f222d567ec19f963
Author: Jacques Lucke
Date:   Thu May 9 10:20:24 2019 +0200
Branches: functions
https://developer.blender.org/rB5fe4ad93bcf25fece85b2212f222d567ec19f963

more specialized iterations loop builder

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

M	source/blender/functions/backends/llvm/builder.cpp
M	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/functions/auto_vectorization.cpp

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

diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
index 5a2e96fdd12..9a9dfa66254 100644
--- a/source/blender/functions/backends/llvm/builder.cpp
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -112,6 +112,9 @@ void CodeBuilder::CreatePrintFloat(llvm::Value *value)
   this->CreateCallPointer((void *)simple_print_float, {value}, this->getVoidTy());
 }
 
+/* For Loop
+ ******************************************/
+
 LLVMForLoopData CodeBuilder::CreateForLoop(std::string name)
 {
   auto entry_block = this->NewBlockInFunction(name + " Entry");
@@ -137,4 +140,33 @@ CodeBuilder LLVMForLoopData::finalize(llvm::Value *condition)
   return CodeBuilder(after_block);
 }
 
+/* Iterations Loop
+ **************************************/
+
+LLVMIterationsLoopData CodeBuilder::CreateNIterationsLoop(llvm::Value *iterations,
+                                                          std::string name)
+{
+  BLI_assert(iterations->getType()->isIntegerTy());
+
+  LLVMForLoopData loop = this->CreateForLoop(name);
+  CodeBuilder &condition_builder = loop.condition_builder();
+
+  llvm::PHINode *current_iteration = condition_builder.CreatePhi(iterations->getType(), 2);
+
+  return LLVMIterationsLoopData(loop, iterations, current_iteration);
+}
+
+CodeBuilder LLVMIterationsLoopData::finalize()
+{
+  CodeBuilder &entry_builder = m_loop.entry_builder();
+  CodeBuilder &condition_builder = m_loop.condition_builder();
+  CodeBuilder &body_builder = m_loop.body_builder();
+
+  llvm::Value *next_iteration = body_builder.CreateIAdd(m_current_iteration, 1);
+  m_current_iteration->addIncoming(entry_builder.getInt32(0), entry_builder.GetInsertBlock());
+  m_current_iteration->addIncoming(next_iteration, body_builder.GetInsertBlock());
+  llvm::Value *condition = condition_builder.CreateICmpULT(m_current_iteration, m_iterations);
+  return m_loop.finalize(condition);
+}
+
 } /* namespace FN */
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index 99890ef6923..8b8109a8ffa 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -11,6 +11,7 @@ using LLVMValuesRef = ArrayRef<llvm::Value *>;
 
 class LLVMTypeInfo;
 class LLVMForLoopData;
+class LLVMIterationsLoopData;
 
 template<typename T> static llvm::ArrayRef<T> to_llvm_array_ref(const SmallVector<T> &vector)
 {
@@ -210,6 +211,11 @@ class CodeBuilder {
     return m_builder.CreateAdd(a, b);
   }
 
+  llvm::Value *CreateIAdd(llvm::Value *a, int value)
+  {
+    return m_builder.CreateAdd(a, this->getInt32(value));
+  }
+
   llvm::Value *CreateFAdd(llvm::Value *a, llvm::Value *b)
   {
     return m_builder.CreateFAdd(a, b);
@@ -387,6 +393,7 @@ class CodeBuilder {
    **************************************/
 
   LLVMForLoopData CreateForLoop(std::string name = "");
+  LLVMIterationsLoopData CreateNIterationsLoop(llvm::Value *iterations, std::string name = "");
 };
 
 class LLVMForLoopData {
@@ -426,4 +433,31 @@ class LLVMForLoopData {
   CodeBuilder finalize(llvm::Value *condition);
 };
 
+class LLVMIterationsLoopData {
+ private:
+  LLVMForLoopData m_loop;
+  llvm::Value *m_iterations;
+  llvm::PHINode *m_current_iteration;
+
+ public:
+  LLVMIterationsLoopData(LLVMForLoopData loop,
+                         llvm::Value *iterations,
+                         llvm::PHINode *current_iteration)
+      : m_loop(loop), m_iterations(iterations), m_current_iteration(current_iteration)
+  {
+  }
+
+  CodeBuilder &body_builder()
+  {
+    return m_loop.body_builder();
+  }
+
+  llvm::Value *current_iteration()
+  {
+    return m_current_iteration;
+  }
+
+  CodeBuilder finalize();
+};
+
 } /* namespace FN */
diff --git a/source/blender/functions/functions/auto_vectorization.cpp b/source/blender/functions/functions/auto_vectorization.cpp
index ef29b1fdf81..424c03ffa32 100644
--- a/source/blender/functions/functions/auto_vectorization.cpp
+++ b/source/blender/functions/functions/auto_vectorization.cpp
@@ -64,20 +64,15 @@ class AutoVectorizationGen : public LLVMBuildIRBody {
                 CodeInterface &interface,
                 const BuildIRSettings &settings) const override
   {
-    auto loop = builder.CreateForLoop();
-    CodeBuilder &entry_builder = loop.entry_builder();
-    CodeBuilder &condition_builder = loop.condition_builder();
-    CodeBuilder &body_builder = loop.body_builder();
-
-    LLVMValues input_list_lengths = this->get_input_list_lengths(entry_builder, interface);
-    llvm::Value *max_length = entry_builder.CreateSIntMax(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(entry_builder, interface);
-    LLVMValues output_data_pointers = this->create_output_lists(
-        entry_builder, interface, max_length);
+    LLVMValues input_data_pointers = this->get_input_data_pointers(builder, interface);
+    LLVMValues output_data_pointers = this->create_output_lists(builder, interface, max_length);
 
-    auto *iteration = condition_builder.CreatePhi(condition_builder.getInt32Ty(), 2);
-    auto *condition = condition_builder.CreateICmpULT(iteration, max_length);
+    auto loop = builder.CreateNIterationsLoop(max_length);
+    CodeBuilder &body_builder = loop.body_builder();
+    llvm::Value *iteration = loop.current_iteration();
 
     LLVMValues main_inputs = this->prepare_main_function_inputs(
         body_builder, interface, input_data_pointers, iteration);
@@ -91,12 +86,7 @@ class AutoVectorizationGen : public LLVMBuildIRBody {
     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));
-
-    iteration->addIncoming(condition_builder.getInt32(0), entry_builder.GetInsertBlock());
-    iteration->addIncoming(next_iteration, body_builder.GetInsertBlock());
-
-    builder.SetInsertPoint(loop.finalize(condition).GetInsertBlock());
+    builder.SetInsertPoint(loop.finalize().GetInsertBlock());
     this->free_input_lists(builder, interface);
   }



More information about the Bf-blender-cvs mailing list