aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Grosheintz <luc.grosheintz@gmail.com>2025-08-03 22:57:27 +0200
committerTomasz Kamiński <tkaminsk@redhat.com>2025-08-21 10:20:57 +0200
commit0197c3b15853de18d7bce386caed6f7fa792fb33 (patch)
tree23cfe97352fe0b25e9759ba22766369f19302238
parent5bcaee96c6c617ba031e0e71c4be2cc0cbd781d8 (diff)
downloadgcc-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/mdspan4
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
{