[llvm] [flang][runtime] Speed up initialization & destruction (PR #148087)

Peter Klausler via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 12 09:55:19 PDT 2025


================
@@ -106,16 +88,41 @@ RT_API_ATTRS int InitializeTicket::Continue(WorkQueue &workQueue) {
       GetComponentExtents(extents, *component_, instance_);
       Descriptor &compDesc{componentDescriptor_.descriptor()};
       const typeInfo::DerivedType &compType{*component_->derivedType()};
-      compDesc.Establish(compType,
-          instance_.ElementComponent<char>(subscripts_, component_->offset()),
-          component_->rank(), extents);
-      Advance();
+      compDesc.Establish(compType, rawComponent, component_->rank(), extents);
       if (int status{workQueue.BeginInitialize(compDesc, compType)};
           status != StatOk) {
+        SkipToNextComponent();
         return status;
       }
-    } else {
-      SkipToNextComponent();
+    }
+  }
+  // The first element is now complete.  Copy it into the others.
+  if (elements_ < 2) {
+  } else {
+    auto elementBytes{static_cast<SubscriptValue>(instance_.ElementBytes())};
+    if (auto stride{instance_.FixedStride()}) {
+      if (*stride == elementBytes) { // contiguous
+        for (std::size_t done{1}; done < elements_;) {
+          std::size_t chunk{elements_ - done};
+          if (chunk > done) {
+            chunk = done;
+          }
+          char *uninitialized{rawInstance + done * *stride};
+          std::memcpy(uninitialized, rawInstance, chunk * *stride);
----------------
klausler wrote:

`memcpy` is not defined for overlapping regions, unfortunately.

https://github.com/llvm/llvm-project/pull/148087


More information about the llvm-commits mailing list