On Sun, Aug 3, 2025 at 11:08 PM Luc Grosheintz <luc.groshei...@gmail.com>
wrote:

> 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 (__all_dynamic): Add arguments __begin
>         and __end.
>         (__fwd_prods): Relax condition for fully-dynamic extents to
>         cover (dyn, ..., dyn, X).
>         (__rev_partial_prods): Analogous for (X, dyn, ..., dyn).
>
> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
> ---
>  libstdc++-v3/include/std/mdspan | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/mdspan
> b/libstdc++-v3/include/std/mdspan
> index 49e3969134b..ccf1028466f 100644
> --- a/libstdc++-v3/include/std/mdspan
> +++ b/libstdc++-v3/include/std/mdspan
> @@ -49,12 +49,13 @@ namespace std _GLIBCXX_VISIBILITY(default)
>  _GLIBCXX_BEGIN_NAMESPACE_VERSION
>    namespace __mdspan
>    {
> +
>      template<array _Extents>
>        consteval bool
> -      __all_dynamic()
> +      __all_dynamic(size_t __begin = 0, size_t __end = _Extents.size())
>
I removed this change.

>        {
> -       for(auto __ext : _Extents)
> -         if (__ext != dynamic_extent)
> +       for(size_t __i = __begin; __i < __end; ++__i)
> +         if (_Extents[__i] != dynamic_extent)
>             return false;
>         return true;
>        }
> @@ -469,7 +470,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<__sta_exts>(0, __rank-1))
>
With my previous change to pass span to __all_dynamic, replacing this wiht:
  else if constexpr (__all_dynamic(std::span(__sta_exts).first(__rank-1)))

>           return __extents_prod(__exts, 1, 0, __r);
>         else
>           {
> @@ -488,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<__sta_exts>(1, __rank))
>
      else if constexpr
(__all_dynamic(std::span(__sta_exts).last(__rank-1)))

>           return __extents_prod(__exts, 1, __r + 1, __rank);
>         else
>           {
> --
> 2.50.0
>
>

Reply via email to