]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Enable memset optimizations for distinct character types [PR93059]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 10 Oct 2024 12:36:33 +0000 (13:36 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 14 Oct 2024 09:38:46 +0000 (10:38 +0100)
commitd8ef4471cb9c9f86784b62424a215ea42173bfe1
treeea5749b2f6a0e8bf0a429fd782c0ebc12cdeb55d
parent308d19c11e119b2c5abf67778dd0ac8a370e5df7
libstdc++: Enable memset optimizations for distinct character types [PR93059]

Currently we only optimize std::fill to memset when the source and
destination types are the same byte-sized type. This means that we fail
to optimize cases like std::fill(buf. buf+n, 0) because the literal 0 is
not the same type as the character buffer.

Such cases can safely be optimized to use memset, because assigning an
int (or other integer) to a narrow character type has the same effects
as converting the integer to unsigned char then copying it with memset.

This patch enables the optimized code path when the fill character is a
memcpy-able integer (using the new __memcpyable_integer trait). We still
need to check is_same<U, T> to enable the memset optimization for
filling a range of std::byte with a std::byte value, because that isn't
a memcpyable integer.

libstdc++-v3/ChangeLog:

PR libstdc++/93059
* include/bits/stl_algobase.h (__fill_a1(T*, T*, const T&)):
Change template parameters and enable_if condition to allow the
fill value to be an integer.
libstdc++-v3/include/bits/stl_algobase.h