diff options
author | Luc Grosheintz <luc.grosheintz@gmail.com> | 2025-08-03 22:57:27 +0200 |
---|---|---|
committer | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-08-21 10:20:57 +0200 |
commit | 0197c3b15853de18d7bce386caed6f7fa792fb33 (patch) | |
tree | 23cfe97352fe0b25e9759ba22766369f19302238 | |
parent | 5bcaee96c6c617ba031e0e71c4be2cc0cbd781d8 (diff) | |
download | gcc-0197c3b15853de18d7bce386caed6f7fa792fb33.zip gcc-0197c3b15853de18d7bce386caed6f7fa792fb33.tar.gz gcc-0197c3b15853de18d7bce386caed6f7fa792fb33.tar.bz2 |
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 <tkaminsk@redhat.com>
Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
-rw-r--r-- | libstdc++-v3/include/std/mdspan | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan index d98b91d..a9168af 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 { |