Re: [PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits
On Tue, Jun 20, 2023 at 8:32 AM Patrick Palka wrote: > > On Thu, 15 Jun 2023, Ken Matsui via Libstdc++ wrote: > > > 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. > > That's more like it :D Though the benchmark should also invoke the > trait on non-object types too, e.g. Instantiator& or Instantiator(int). Here is the updated benchmark: https://github.com/ken-matsui/gcc-benches/blob/main/is_object.md#sat-jun-24-080110-am-pdt-2023 Time: -74.7544% Peak Memory Usage: -62.5913% Total Memory Usage: -64.2708% > > > > Sincerely, > > Ken Matsui > > > > On Mon, Jun 12, 2023 at 3:49 PM Ken Matsui > > 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_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_void(_Tp))> > > > > > > This would instantiate only __bool_constant and > > > __bool_constant, > > > 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 > > > > > > >
Re: [PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits
On Thu, 15 Jun 2023, Ken Matsui via Libstdc++ wrote: > 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. That's more like it :D Though the benchmark should also invoke the trait on non-object types too, e.g. Instantiator& or Instantiator(int). > > Sincerely, > Ken Matsui > > On Mon, Jun 12, 2023 at 3:49 PM Ken Matsui 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_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_void(_Tp))> > > > > This would instantiate only __bool_constant and > > __bool_constant, > > 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 > > > >
Re: [PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits
Just a quick update, the benchmark code link has been updated and can now be accessed at https://github.com/ken-matsui/gcc-benches/blob/main/is_object.cc. I have also created a report file which can be found at https://github.com/ken-matsui/gcc-benches/blob/main/is_object.md. On Thu, Jun 15, 2023 at 3:49 AM Ken Matsui wrote: > > 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 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_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_void(_Tp))> > > > > This would instantiate only __bool_constant and > > __bool_constant, > > 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 > >
Re: [PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits
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 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_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_void(_Tp))> > > This would instantiate only __bool_constant and __bool_constant, > 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 >
[PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits
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_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 This would instantiate only __bool_constant and __bool_constant, 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