https://gcc.gnu.org/g:0197c3b15853de18d7bce386caed6f7fa792fb33

commit r16-3315-g0197c3b15853de18d7bce386caed6f7fa792fb33
Author: Luc Grosheintz <luc.groshei...@gmail.com>
Date:   Sun Aug 3 22:57:27 2025 +0200

    libstdc++: Improve nearly fully dynamic extents in mdspan.
    
    One previous commit optimized fully dynamic extents; and another
    refactored __size such that __fwd_prod is valid for __r = 0, ..., rank
    (exclusive).
    
    Therefore, by noticing that __rev_prod (and __fwd_prod) never accesses
    the first (or last) extent, one can avoid pre-computing partial products
    of static extents in those cases, if all other extents are dynamic.
    
    We check that the size of the reference object file decreases further
    and the .rodata sections for
    
      __fwd_prod<dyn, ..., dyn, 11>
      __rev_prod<3, dyn, ..., dyn>
    
    are absent.
    
    libstdc++-v3/ChangeLog:
    
            * include/std/mdspan (__fwd_prods): Relax condition for 
fully-dynamic
            extents to cover (dyn, ..., dyn, X).
            (__rev_partial_prods): Analogous for (X, dyn, ..., dyn).
    
    Reviewed-by: Tomasz KamiƄski <tkami...@redhat.com>
    Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>

Diff:
---
 libstdc++-v3/include/std/mdspan | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index d98b91d44192..a9168af4acce 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -469,7 +469,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return 1;
        else if constexpr (__rank == 2)
          return __r == 0 ? 1 : __exts.extent(0);
-       else if constexpr (__all_dynamic(__sta_exts))
+       else if constexpr (__all_dynamic(std::span(__sta_exts).first(__rank-1)))
          return __extents_prod(__exts, 1, 0, __r);
        else
          {
@@ -489,7 +489,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return 1;
        else if constexpr (__rank == 2)
          return __r == 0 ? __exts.extent(1) : 1;
-       else if constexpr (__all_dynamic(__sta_exts))
+       else if constexpr (__all_dynamic(std::span(__sta_exts).last(__rank-1)))
          return __extents_prod(__exts, 1, __r + 1, __rank);
        else
          {

Reply via email to