[Bf-blender-cvs] [640a744d54c] functions: start simplifying automatic vectorization

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


Commit: 640a744d54cc3e93ef39078a41b1b118ce9140d2
Author: Jacques Lucke
Date:   Wed May 1 19:12:04 2019 +0200
Branches: functions
https://developer.blender.org/rB640a744d54cc3e93ef39078a41b1b118ce9140d2

start simplifying automatic vectorization

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

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.hpp b/source/blender/functions/backends/llvm/builder.hpp
index c0f776faa72..6698d2b3188 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -233,6 +233,12 @@ class CodeBuilder {
     return m_builder.CreatePointerCast(addr, base_type->getPointerTo());
   }
 
+  llvm::Value *CastToPointerWithStride(llvm::Value *addr, uint stride)
+  {
+    llvm::Type *stride_type = this->getFixedSizeType(stride);
+    return this->CastToPointerOf(addr, stride_type);
+  }
+
   llvm::Value *CastToVoidPtr(llvm::Value *addr)
   {
     return m_builder.CreatePointerCast(addr, this->getVoidPtrTy());
diff --git a/source/blender/functions/functions/auto_vectorization.cpp b/source/blender/functions/functions/auto_vectorization.cpp
index dba2f629ccf..6914e032e49 100644
--- a/source/blender/functions/functions/auto_vectorization.cpp
+++ b/source/blender/functions/functions/auto_vectorization.cpp
@@ -8,87 +8,93 @@
 namespace FN {
 namespace Functions {
 
-static llvm::Value *build_ir__get_list_length(CodeBuilder &builder,
-                                              SharedType &base_type,
-                                              llvm::Value *list)
-{
-  return builder.CreateCallPointer(
-      (void *)GET_C_FN_list_length(base_type), {list}, builder.getInt32Ty());
-}
-
-static llvm::Value *build_ir__get_list_value_ptr(CodeBuilder &builder,
-                                                 SharedType &base_type,
-                                                 llvm::Value *list)
-{
-  return builder.CreateCallPointer_RetVoidPtr((void *)GET_C_FN_list_data_ptr(base_type), {list});
-}
-
-static llvm::Value *build_ir__new_list_with_prepared_memory(CodeBuilder &builder,
-                                                            SharedType &base_type,
-                                                            llvm::Value *length)
-{
-  return builder.CreateCallPointer_RetVoidPtr(
-      (void *)GET_C_FN_new_list_with_allocated_buffer(base_type), {length});
-}
-
 class AutoVectorizationGen : public LLVMBuildIRBody {
  private:
   SharedFunction m_main;
   SmallVector<bool> m_input_is_list;
-  SmallVector<uint> m_list_inputs;
+
+  struct InputInfo {
+    bool is_list;
+    CPPTypeInfo *base_cpp_type;
+    LLVMTypeInfo *base_llvm_type;
+    LLVMTypeInfo *list_llvm_type;
+    GetListLength get_length_fn;
+    GetListDataPtr get_data_ptr_fn;
+  };
+
+  struct OutputInfo {
+    CPPTypeInfo *base_cpp_type;
+    LLVMTypeInfo *base_llvm_type;
+    NewListWithAllocatedBuffer get_new_list_fn;
+    GetListDataPtr get_data_ptr_fn;
+  };
+
+  SmallVector<InputInfo> m_input_info;
+  SmallVector<OutputInfo> m_output_info;
 
  public:
   AutoVectorizationGen(SharedFunction main, const SmallVector<bool> &input_is_list)
       : m_main(main), m_input_is_list(input_is_list)
   {
-    for (uint i = 0; i < input_is_list.size(); i++) {
-      if (input_is_list[i]) {
-        m_list_inputs.append(i);
-      }
+    BLI_assert(input_is_list.contains(true));
+    for (uint i = 0; i < main->signature().inputs().size(); i++) {
+      SharedType &base_type = main->signature().inputs()[i].type();
+      SharedType &list_type = get_list_type(base_type);
+      InputInfo info;
+      info.is_list = input_is_list[i];
+      info.base_cpp_type = base_type->extension<CPPTypeInfo>();
+      info.base_llvm_type = base_type->extension<LLVMTypeInfo>();
+      info.list_llvm_type = list_type->extension<LLVMTypeInfo>();
+      info.get_length_fn = GET_C_FN_list_length(base_type);
+      info.get_data_ptr_fn = GET_C_FN_list_data_ptr(base_type);
+      m_input_info.append(info);
+    }
+    for (auto &output : main->signature().outputs()) {
+      SharedType &base_type = output.type();
+      OutputInfo info;
+      info.base_cpp_type = base_type->extension<CPPTypeInfo>();
+      info.base_llvm_type = base_type->extension<LLVMTypeInfo>();
+      info.get_new_list_fn = GET_C_FN_new_list_with_allocated_buffer(base_type);
+      info.get_data_ptr_fn = GET_C_FN_list_data_ptr(base_type);
+      m_output_info.append(info);
     }
-
-    BLI_assert(m_list_inputs.size() >= 1);
   }
 
   void build_ir(CodeBuilder &builder,
                 CodeInterface &interface,
                 const BuildIRSettings &settings) const override
   {
-    LLVMValues list_lengths;
-    Signature &main_sig = m_main->signature();
-
-    for (uint index : m_list_inputs) {
-      llvm::Value *length = build_ir__get_list_length(
-          builder, this->input_type(index), interface.get_input(index));
-      list_lengths.append(length);
+    LLVMValues input_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);
+      }
     }
 
-    llvm::Value *max_length = builder.CreateSIntMax(list_lengths);
+    llvm::Value *max_length = builder.CreateSIntMax(input_list_lengths);
 
     LLVMValues input_data_pointers;
-    for (uint index : m_list_inputs) {
-      SharedType &type = this->input_type(index);
-      auto *cpp_type_info = type->extension<CPPTypeInfo>();
-      llvm::Type *stride_type = builder.getFixedSizeType(cpp_type_info->size_of_type());
-
-      llvm::Value *data_ptr = build_ir__get_list_value_ptr(
-          builder, type, interface.get_input(index));
-      llvm::Value *typed_data_ptr = builder.CastToPointerOf(data_ptr, stride_type);
-
-      input_data_pointers.append(typed_data_ptr);
+    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);
+      }
     }
 
     LLVMValues output_data_pointers;
-    for (uint i = 0; i < main_sig.outputs().size(); i++) {
-      SharedType &type = main_sig.outputs()[i].type();
-      auto *cpp_type_info = type->extension<CPPTypeInfo>();
-      llvm::Type *stride_type = builder.getFixedSizeType(cpp_type_info->size_of_type());
-
-      llvm::Value *output_list = build_ir__new_list_with_prepared_memory(
-          builder, type, max_length);
-      llvm::Value *data_ptr = build_ir__get_list_value_ptr(builder, type, output_list);
-      llvm::Value *typed_data_ptr = builder.CastToPointerOf(data_ptr, stride_type);
-
+    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});
+      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);
       interface.set_output(i, output_list);
     }
@@ -111,39 +117,35 @@ class AutoVectorizationGen : public LLVMBuildIRBody {
     LLVMValues main_inputs;
 
     uint list_input_index = 0;
-    for (uint i = 0; i < main_sig.inputs().size(); i++) {
-      SharedType &type = this->input_type(i);
-      auto *llvm_type_info = type->extension<LLVMTypeInfo>();
-      BLI_assert(llvm_type_info);
+    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);
         // TODO: handle different lengths
-        llvm::Value *value_for_main = llvm_type_info->build_load_ir__relocate(body_builder,
-                                                                              load_address);
+        llvm::Value *value_for_main = m_input_info[i].base_llvm_type->build_load_ir__relocate(
+            body_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 = llvm_type_info->build_copy_ir(body_builder, source_value);
+        llvm::Value *value_for_main = m_input_info[i].base_llvm_type->build_copy_ir(body_builder,
+                                                                                    source_value);
         main_inputs.append(value_for_main);
       }
     }
 
-    LLVMValues main_outputs(main_sig.outputs().size());
+    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 < main_sig.outputs().size(); i++) {
-      SharedType &type = main_sig.outputs()[i].type();
-      auto *type_info = type->extension<LLVMTypeInfo>();
+    for (uint i = 0; i < m_output_info.size(); i++) {
       llvm::Value *store_address = body_builder.CreateGEP(output_data_pointers[i], iteration);
-      llvm::Value *computed_value = main_outputs[i];
-      type_info->build_store_ir__relocate(body_builder, computed_value, store_address);
+      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));
@@ -154,21 +156,13 @@ class AutoVectorizationGen : public LLVMBuildIRBody {
 
     builder.SetInsertPoint(end_block);
 
-    for (uint i = 0; i < m_list_inputs.size(); i++) {
-      uint index = m_list_inputs[i];
-      SharedType &base_type = main_sig.inputs()[index].type();
-      SharedType &list_type = get_list_type(base_type);
-      auto *type_info =

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list