[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