Hi,

For those curious about the performance improvements of this patch, I
conducted a benchmark that instantiates 256k specializations of
is_object_v based on Patrick's code. You can find the benchmark code
at this link:

https://github.com/ken-matsui/gcc-benches/blob/main/is_object_benchmark.cc

On my computer, using the gcc HEAD of this patch for a release build,
the patch with -DUSE_BUILTIN took 64% less time and used 44-47% less
memory compared to not using it.

Sincerely,
Ken Matsui

On Mon, Jun 12, 2023 at 3:49 PM Ken Matsui <kmat...@cs.washington.edu> wrote:
>
> Hi,
>
> This patch series gets std::is_object to dispatch to built-in traits and
> implements the following built-in traits, on which std::object depends.
>
>         * __is_reference
>         * __is_function
>         * __is_void
>
> std::is_object was depending on them with disjunction and negation.
>
> __not_<__or_<is_function<_Tp>, is_reference<_Tp>, is_void<_Tp>>>::type
>
> Therefore, this patch uses them directly instead of implementing an additional
> built-in trait __is_object, which makes the compiler slightly bigger and
> slower.
>
> __bool_constant<!(__is_function(_Tp) || __is_reference(_Tp) || 
> __is_void(_Tp))>
>
> This would instantiate only __bool_constant<true> and __bool_constant<false>,
> which can be mostly shared. That is, the purpose of built-in traits is
> considered as achieved.
>
> Changes in v7
>
>         * Removed an unnecessary new line.
>
> Ken Matsui (6):
>   c++: implement __is_reference built-in trait
>   libstdc++: use new built-in trait __is_reference for std::is_reference
>   c++: implement __is_function built-in trait
>   libstdc++: use new built-in trait __is_function for std::is_function
>   c++, libstdc++: implement __is_void built-in trait
>   libstdc++: make std::is_object dispatch to new built-in traits
>
>  gcc/cp/constraint.cc                          |  9 +++
>  gcc/cp/cp-trait.def                           |  3 +
>  gcc/cp/semantics.cc                           | 12 ++++
>  gcc/testsuite/g++.dg/ext/has-builtin-1.C      |  9 +++
>  gcc/testsuite/g++.dg/ext/is_function.C        | 58 +++++++++++++++++++
>  gcc/testsuite/g++.dg/ext/is_reference.C       | 34 +++++++++++
>  gcc/testsuite/g++.dg/ext/is_void.C            | 35 +++++++++++
>  gcc/testsuite/g++.dg/tm/pr46567.C             |  6 +-
>  libstdc++-v3/include/bits/cpp_type_traits.h   | 15 -----
>  libstdc++-v3/include/debug/helper_functions.h |  5 +-
>  libstdc++-v3/include/std/type_traits          | 51 ++++++++++++++++
>  11 files changed, 216 insertions(+), 21 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/ext/is_function.C
>  create mode 100644 gcc/testsuite/g++.dg/ext/is_reference.C
>  create mode 100644 gcc/testsuite/g++.dg/ext/is_void.C
>
> --
> 2.41.0
>

Reply via email to