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>
next prev 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: linkBe 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).