This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [PATCH] PR libstdc++/91788 improve codegen for std::variant<T...>::index()
- From: Marc Glisse <marc dot glisse at inria dot fr>
- To: Jonathan Wakely <jwakely at redhat dot com>
- Cc: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Mon, 23 Sep 2019 19:39:29 +0200 (CEST)
- Subject: Re: [PATCH] PR libstdc++/91788 improve codegen for std::variant<T...>::index()
- References: <20190923155411.GA24947@redhat.com>
- Reply-to: libstdc++ at gcc dot gnu dot org
On Mon, 23 Sep 2019, Jonathan Wakely wrote:
If __index_type is a smaller type than size_t, then the result of
size_t(__index_type(-1)) is not equal to size_t(-1), but to an incorrect
value such as size_t(255) or size_t(65535). The old implementation of
variant<T...>::index() uses (size_t(__index_type(_M_index + 1)) - 1)
which is always correct, but generates suboptimal code for many common
cases.
When the __index_type is size_t or valueless variants are not possible
we can just return the value directly.
When the number of alternatives is sufficiently small the result of
converting the _M_index value to the corresponding signed type will be
either non-negative or -1. In those cases converting to the signed type
and then to size_t will either produce the correct positive value or
will sign extend -1 to (size_t)-1 as desired.
For the remaining case we keep the existing arithmetic operations to
ensure the correct result.
PR libstdc++/91788 (partial)
* include/std/variant (variant::index()): Improve codegen for cases
where conversion to size_t already works correctly.
Tested x86_64-linux, committed to trunk.
Thanks.
+ if constexpr (is_same_v<__index_type, size_t>)
+ return this->_M_index;
I don't think this special case is useful, gcc has no trouble optimizing
the other 2 versions to nothing when the types are the same. Of course it
won't hurt either.
--
Marc Glisse