public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "hubicka at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug libstdc++/114821] _M_realloc_append should use memcpy instead of loop to copy data when possible
Date: Tue, 23 Apr 2024 08:52:29 +0000	[thread overview]
Message-ID: <bug-114821-4-XBpBevNS6Y@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-114821-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114821

--- Comment #2 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
What I am shooting for is to optimize it later in loop distribution. We can
recognize memcpy loop if we can figure out that source and destination memory
are different.

We can help here with restrict, but I was bit lost in how to get them done.

This seems to do the trick, but for some reason I get memmove

diff --git a/libstdc++-v3/include/bits/stl_uninitialized.h
b/libstdc++-v3/include/bits/stl_uninitialized.h
index 7f84da31578..1a6223ea892 100644
--- a/libstdc++-v3/include/bits/stl_uninitialized.h
+++ b/libstdc++-v3/include/bits/stl_uninitialized.h
@@ -1130,7 +1130,58 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
       return __result + __count;
     }
+
+  template <typename _Tp, typename _Allocator>
+    _GLIBCXX20_CONSTEXPR
+    inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
+    __relocate_a(_Tp * __restrict __first, _Tp *__last,
+                _Tp * __restrict __result, _Allocator& __alloc) noexcept
+    {
+      ptrdiff_t __count = __last - __first;
+      if (__count > 0)
+       {
+#ifdef __cpp_lib_is_constant_evaluated
+         if (std::is_constant_evaluated())
+           {
+             for (; __first != __last; ++__first, (void)++__result)
+               {
+                 // manually inline relocate_object_a to not lose restrict
qualifiers
+                 typedef std::allocator_traits<_Allocator> __traits;
+                 __traits::construct(__alloc, __result, std::move(*__first));
+                 __traits::destroy(__alloc, std::__addressof(*__first));
+               }
+             return __result;
+           }
 #endif
+         __builtin_memcpy(__result, __first, __count * sizeof(_Tp));
+       }
+      return __result + __count;
+    }
+#endif
+
+  template <typename _Tp, typename _Allocator>
+    _GLIBCXX20_CONSTEXPR
+#if _GLIBCXX_HOSTED
+    inline __enable_if_t<!std::__is_bitwise_relocatable<_Tp>::value, _Tp*>
+#else
+    inline _Tp *
+#endif
+    __relocate_a(_Tp * __restrict __first, _Tp *__last,
+                _Tp * __restrict __result, _Allocator& __alloc)
+    noexcept(noexcept(std::allocator_traits<_Allocator>::construct(__alloc,
+                        __result, std::move(*__first)))
+            && noexcept(std::allocator_traits<_Allocator>::destroy(
+                           __alloc, std::__addressof(*__first))))
+    {
+      for (; __first != __last; ++__first, (void)++__result)
+       {
+         // manually inline relocate_object_a to not lose restrict qualifiers
+         typedef std::allocator_traits<_Allocator> __traits;
+         __traits::construct(__alloc, __result, std::move(*__first));
+         __traits::destroy(__alloc, std::__addressof(*__first));
+       }
+      return __result;
+    }

   template <typename _InputIterator, typename _ForwardIterator,
            typename _Allocator>

  parent reply	other threads:[~2024-04-23  8:52 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-23  8:14 [Bug libstdc++/114821] New: " hubicka at gcc dot gnu.org
2024-04-23  8:30 ` [Bug libstdc++/114821] " redi at gcc dot gnu.org
2024-04-23  8:52 ` hubicka at gcc dot gnu.org [this message]
2024-04-23 10:41 ` redi at gcc dot gnu.org
2024-04-23 10:51 ` redi at gcc dot gnu.org
2024-04-23 11:01 ` redi at gcc dot gnu.org
2024-04-23 12:08 ` hubicka at gcc dot gnu.org
2024-04-23 12:33 ` redi at gcc dot gnu.org
2024-04-23 12:38 ` hubicka at gcc dot gnu.org
2024-04-23 12:41 ` hubicka at gcc dot gnu.org
2024-04-23 12:42 ` redi at gcc dot gnu.org
2024-04-23 13:11 ` redi at gcc dot gnu.org
2024-04-23 15:53 ` redi at gcc dot gnu.org
2024-04-24 14:23 ` hubicka at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-114821-4-XBpBevNS6Y@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).