[flang-commits] [flang] [llvm] [flang-rt] - Lightweight runtime assignment function (AssignSimple) for intrinsic-type assignments (PR #213704)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Tue Aug 4 04:03:18 PDT 2026
================
@@ -851,6 +852,218 @@ void RTDEF(AssignExplicitLengthCharacter)(Descriptor &to,
ExplicitLengthCharacterLHS);
}
+void RTDEF(AssignSimple)(Descriptor &to, const Descriptor &from,
+ const char *sourceFile, int sourceLine) {
+ Terminator terminator{sourceFile, sourceLine};
+ // AssignSimple: fast path for intrinsic type assignments (integer, real,
+ // complex, logical). The compiler routes here only when:
+ // - LHS element type is trivial (isa_trivial), not derived/polymorphic
+ // - LHS and RHS ranks match (no scalar-to-array broadcasting)
+ // - LHS is not volatile (volatile needs memory ordering semantics)
+
+ if (to.rank() != from.rank()) {
+ terminator.Crash("AssignSimple: rank mismatch (to.rank=%d, from.rank=%d)",
+ to.rank(), from.rank());
+ }
+ if (to.ElementBytes() != from.ElementBytes()) {
+ terminator.Crash("AssignSimple: ElementBytes mismatch (to.ElementBytes=%d, "
+ "from.ElementBytes=%d)",
+ to.ElementBytes(), from.ElementBytes());
+ }
+ if (to.type().IsDerived()) {
+ terminator.Crash("AssignSimple: Cannot assign to derived type");
+ }
+
+ std::size_t elementBytes{to.ElementBytes()};
+ std::size_t elements{from.Elements()};
+
+ // Conformability check for non-allocatable arrays.
+ // 1. For allocatable LHS, shape mismatch triggers reallocation (handled in
+ // Step 2 below).
+ // 2. For non-allocatable LHS, shape mismatch is an error per Fortran
+ // 2018 10.2.1.2 -- the shapes must conform. This matches the
+ // conformability check in AssignTicket::Begin().
+ //
+ // Example: x(8:1:-3) = x(5:2:-2) where x is not allocatable and LHS has 3
+ // elements, RHS has 2.
+ if (!to.IsAllocatable() && from.rank() > 0) {
+ std::size_t toElements{to.Elements()};
+ if (toElements != elements) {
+ terminator.Crash("AssignSimple: mismatching element counts in "
+ "non-allocatable array assignment (to %zd, from %zd)",
+ toElements, elements);
+ }
+ }
+
+ // Step 1: Aliasing detection.
----------------
tblah wrote:
Why did you chose to keep alias analysis in the fast path? In most cases (including firstprivate for anything that isn't a POINTER) the frontend can determine statically that there isn't any possibility of aliasing.
https://github.com/llvm/llvm-project/pull/213704
More information about the flang-commits
mailing list