Re: [PATCH v7 0/6] c++, libstdc++: get std::is_object to dispatch to new built-in traits

2023-06-24 Thread Ken Matsui via Gcc-patches
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

2023-06-20 Thread Patrick Palka via Gcc-patches
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

2023-06-20 Thread Ken Matsui via Gcc-patches
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

2023-06-15 Thread Ken Matsui via Gcc-patches
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
>