* [PATCH 0/8] Optimize more type traits @ 2023-12-23 21:20 Ken Matsui 2023-12-23 21:20 ` [PATCH 1/8] c++: Implement __is_const built-in trait Ken Matsui 2023-12-23 21:20 ` [PATCH 2/8] libstdc++: Optimize std::is_const compilation performance Ken Matsui 0 siblings, 2 replies; 4+ messages in thread From: Ken Matsui @ 2023-12-23 21:20 UTC (permalink / raw) To: gcc-patches; +Cc: libstdc++, Ken Matsui This patch series implements __is_const, __is_volatile, __is_pointer, and __is_unbounded_array built-in traits, which were isolated from my previous patch series "Optimize type traits compilation performance" because they contained performance regression. I confirmed that this patch series does not cause any performance regression. The main reason of the performance regression were the exhaustiveness of the benchmarks and the instability of the benchmark results. Here are new benchmark results: is_const: https://github.com/ken-matsui/gcc-bench/blob/main/is_const.md#sat-dec-23-090605-am-pst-2023 time: -4.36603%, peak memory: -0.300891%, total memory: -0.247934% is_volatile_v: https://github.com/ken-matsui/gcc-bench/blob/main/is_volatile_v.md#sat-dec-23-091518-am-pst-2023 time: -4.06816%, peak memory: -0.609298%, total memory: -0.659134% is_pointer: https://github.com/ken-matsui/gcc-bench/blob/main/is_pointer.md#sat-dec-23-124903-pm-pst-2023 time: -2.47124%, peak memory: -2.98207%, total memory: -4.0811% is_unbounded_array_v: https://github.com/ken-matsui/gcc-bench/blob/main/is_unbounded_array_v.md#sat-dec-23-010046-pm-pst-2023 time: -1.50025%, peak memory: -1.07386%, total memory: -2.32394% Ken Matsui (8): c++: Implement __is_const built-in trait libstdc++: Optimize std::is_const compilation performance c++: Implement __is_volatile built-in trait libstdc++: Optimize std::is_volatile compilation performance c++: Implement __is_pointer built-in trait libstdc++: Optimize std::is_pointer compilation performance c++: Implement __is_unbounded_array built-in trait libstdc++: Optimize std::is_unbounded_array compilation performance gcc/cp/constraint.cc | 12 +++ gcc/cp/cp-trait.def | 4 + gcc/cp/semantics.cc | 16 ++++ gcc/testsuite/g++.dg/ext/has-builtin-1.C | 12 +++ gcc/testsuite/g++.dg/ext/is_const.C | 19 +++++ gcc/testsuite/g++.dg/ext/is_pointer.C | 51 +++++++++++++ gcc/testsuite/g++.dg/ext/is_unbounded_array.C | 37 ++++++++++ gcc/testsuite/g++.dg/ext/is_volatile.C | 19 +++++ libstdc++-v3/include/bits/cpp_type_traits.h | 29 ++++++++ libstdc++-v3/include/std/type_traits | 73 +++++++++++++++++-- 10 files changed, 264 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/is_const.C create mode 100644 gcc/testsuite/g++.dg/ext/is_pointer.C create mode 100644 gcc/testsuite/g++.dg/ext/is_unbounded_array.C create mode 100644 gcc/testsuite/g++.dg/ext/is_volatile.C -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/8] c++: Implement __is_const built-in trait 2023-12-23 21:20 [PATCH 0/8] Optimize more type traits Ken Matsui @ 2023-12-23 21:20 ` Ken Matsui 2023-12-23 21:38 ` Ken Matsui 2023-12-23 21:20 ` [PATCH 2/8] libstdc++: Optimize std::is_const compilation performance Ken Matsui 1 sibling, 1 reply; 4+ messages in thread From: Ken Matsui @ 2023-12-23 21:20 UTC (permalink / raw) To: gcc-patches; +Cc: libstdc++, Ken Matsui This patch implements built-in trait for std::is_const. gcc/cp/ChangeLog: * cp-trait.def: Define __is_const. * constraint.cc (diagnose_trait_expr): Handle CPTK_IS_CONST. * semantics.cc (trait_expr_value): Likewise. (finish_trait_expr): Likewise. gcc/testsuite/ChangeLog: * g++.dg/ext/has-builtin-1.C: Test existence of __is_const. * g++.dg/ext/is_const.C: New test. Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> --- gcc/cp/constraint.cc | 3 +++ gcc/cp/cp-trait.def | 1 + gcc/cp/semantics.cc | 4 ++++ gcc/testsuite/g++.dg/ext/has-builtin-1.C | 3 +++ gcc/testsuite/g++.dg/ext/is_const.C | 19 +++++++++++++++++++ 5 files changed, 30 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/is_const.C diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index eeacead52a5..f1b07aa2853 100644 --- a/gcc/cp/constraint.cc +++ b/gcc/cp/constraint.cc @@ -3734,6 +3734,9 @@ diagnose_trait_expr (tree expr, tree args) case CPTK_IS_CLASS: inform (loc, " %qT is not a class", t1); break; + case CPTK_IS_CONST: + inform (loc, " %qT is not a const type", t1); + break; case CPTK_IS_CONSTRUCTIBLE: if (!t2) inform (loc, " %qT is not default constructible", t1); diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def index 394f006f20f..36faed9c0b3 100644 --- a/gcc/cp/cp-trait.def +++ b/gcc/cp/cp-trait.def @@ -64,6 +64,7 @@ DEFTRAIT_EXPR (IS_ASSIGNABLE, "__is_assignable", 2) DEFTRAIT_EXPR (IS_BASE_OF, "__is_base_of", 2) DEFTRAIT_EXPR (IS_BOUNDED_ARRAY, "__is_bounded_array", 1) DEFTRAIT_EXPR (IS_CLASS, "__is_class", 1) +DEFTRAIT_EXPR (IS_CONST, "__is_const", 1) DEFTRAIT_EXPR (IS_CONSTRUCTIBLE, "__is_constructible", -1) DEFTRAIT_EXPR (IS_CONVERTIBLE, "__is_convertible", 2) DEFTRAIT_EXPR (IS_EMPTY, "__is_empty", 1) diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index e6dba29ee81..364d87ee34d 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -12415,6 +12415,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_CLASS: return NON_UNION_CLASS_TYPE_P (type1); + case CPTK_IS_CONST: + return CP_TYPE_CONST_P (type1); + case CPTK_IS_CONSTRUCTIBLE: return is_xible (INIT_EXPR, type1, type2); @@ -12657,6 +12660,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_ARRAY: case CPTK_IS_BOUNDED_ARRAY: case CPTK_IS_CLASS: + case CPTK_IS_CONST: case CPTK_IS_ENUM: case CPTK_IS_FUNCTION: case CPTK_IS_MEMBER_FUNCTION_POINTER: diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C index 02b4b4d745d..e3640faeb96 100644 --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C @@ -71,6 +71,9 @@ #if !__has_builtin (__is_class) # error "__has_builtin (__is_class) failed" #endif +#if !__has_builtin (__is_const) +# error "__has_builtin (__is_const) failed" +#endif #if !__has_builtin (__is_constructible) # error "__has_builtin (__is_constructible) failed" #endif diff --git a/gcc/testsuite/g++.dg/ext/is_const.C b/gcc/testsuite/g++.dg/ext/is_const.C new file mode 100644 index 00000000000..8f2d7c2fce9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/is_const.C @@ -0,0 +1,19 @@ +// { dg-do compile { target c++11 } } + +#include <testsuite_tr1.h> + +using namespace __gnu_test; + +#define SA(X) static_assert((X),#X) + +// Positive tests. +SA(__is_const(const int)); +SA(__is_const(const volatile int)); +SA(__is_const(cClassType)); +SA(__is_const(cvClassType)); + +// Negative tests. +SA(!__is_const(int)); +SA(!__is_const(volatile int)); +SA(!__is_const(ClassType)); +SA(!__is_const(vClassType)); -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/8] c++: Implement __is_const built-in trait 2023-12-23 21:20 ` [PATCH 1/8] c++: Implement __is_const built-in trait Ken Matsui @ 2023-12-23 21:38 ` Ken Matsui 0 siblings, 0 replies; 4+ messages in thread From: Ken Matsui @ 2023-12-23 21:38 UTC (permalink / raw) To: Ken Matsui; +Cc: gcc-patches, libstdc++ On Sat, Dec 23, 2023 at 1:36 PM Ken Matsui <kmatsui@gcc.gnu.org> wrote: > > This patch implements built-in trait for std::is_const. > > gcc/cp/ChangeLog: > > * cp-trait.def: Define __is_const. > * constraint.cc (diagnose_trait_expr): Handle CPTK_IS_CONST. > * semantics.cc (trait_expr_value): Likewise. > (finish_trait_expr): Likewise. > > gcc/testsuite/ChangeLog: > > * g++.dg/ext/has-builtin-1.C: Test existence of __is_const. > * g++.dg/ext/is_const.C: New test. > > Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> > --- > gcc/cp/constraint.cc | 3 +++ > gcc/cp/cp-trait.def | 1 + > gcc/cp/semantics.cc | 4 ++++ > gcc/testsuite/g++.dg/ext/has-builtin-1.C | 3 +++ > gcc/testsuite/g++.dg/ext/is_const.C | 19 +++++++++++++++++++ > 5 files changed, 30 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/ext/is_const.C > > diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc > index eeacead52a5..f1b07aa2853 100644 > --- a/gcc/cp/constraint.cc > +++ b/gcc/cp/constraint.cc > @@ -3734,6 +3734,9 @@ diagnose_trait_expr (tree expr, tree args) > case CPTK_IS_CLASS: > inform (loc, " %qT is not a class", t1); > break; > + case CPTK_IS_CONST: > + inform (loc, " %qT is not a const type", t1); > + break; > case CPTK_IS_CONSTRUCTIBLE: > if (!t2) > inform (loc, " %qT is not default constructible", t1); > diff --git a/gcc/cp/cp-trait.def b/gcc/cp/cp-trait.def > index 394f006f20f..36faed9c0b3 100644 > --- a/gcc/cp/cp-trait.def > +++ b/gcc/cp/cp-trait.def > @@ -64,6 +64,7 @@ DEFTRAIT_EXPR (IS_ASSIGNABLE, "__is_assignable", 2) > DEFTRAIT_EXPR (IS_BASE_OF, "__is_base_of", 2) > DEFTRAIT_EXPR (IS_BOUNDED_ARRAY, "__is_bounded_array", 1) > DEFTRAIT_EXPR (IS_CLASS, "__is_class", 1) > +DEFTRAIT_EXPR (IS_CONST, "__is_const", 1) > DEFTRAIT_EXPR (IS_CONSTRUCTIBLE, "__is_constructible", -1) > DEFTRAIT_EXPR (IS_CONVERTIBLE, "__is_convertible", 2) > DEFTRAIT_EXPR (IS_EMPTY, "__is_empty", 1) > diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc > index e6dba29ee81..364d87ee34d 100644 > --- a/gcc/cp/semantics.cc > +++ b/gcc/cp/semantics.cc > @@ -12415,6 +12415,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) > case CPTK_IS_CLASS: > return NON_UNION_CLASS_TYPE_P (type1); > > + case CPTK_IS_CONST: > + return CP_TYPE_CONST_P (type1); > + > case CPTK_IS_CONSTRUCTIBLE: > return is_xible (INIT_EXPR, type1, type2); > > @@ -12657,6 +12660,7 @@ finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2) > case CPTK_IS_ARRAY: > case CPTK_IS_BOUNDED_ARRAY: > case CPTK_IS_CLASS: > + case CPTK_IS_CONST: > case CPTK_IS_ENUM: > case CPTK_IS_FUNCTION: > case CPTK_IS_MEMBER_FUNCTION_POINTER: > diff --git a/gcc/testsuite/g++.dg/ext/has-builtin-1.C b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > index 02b4b4d745d..e3640faeb96 100644 > --- a/gcc/testsuite/g++.dg/ext/has-builtin-1.C > +++ b/gcc/testsuite/g++.dg/ext/has-builtin-1.C > @@ -71,6 +71,9 @@ > #if !__has_builtin (__is_class) > # error "__has_builtin (__is_class) failed" > #endif > +#if !__has_builtin (__is_const) > +# error "__has_builtin (__is_const) failed" > +#endif > #if !__has_builtin (__is_constructible) > # error "__has_builtin (__is_constructible) failed" > #endif > diff --git a/gcc/testsuite/g++.dg/ext/is_const.C b/gcc/testsuite/g++.dg/ext/is_const.C > new file mode 100644 > index 00000000000..8f2d7c2fce9 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/ext/is_const.C > @@ -0,0 +1,19 @@ > +// { dg-do compile { target c++11 } } > + > +#include <testsuite_tr1.h> > + Please ignore this patch series. I should have removed testsuite_tr1.h. > +using namespace __gnu_test; > + > +#define SA(X) static_assert((X),#X) > + > +// Positive tests. > +SA(__is_const(const int)); > +SA(__is_const(const volatile int)); > +SA(__is_const(cClassType)); > +SA(__is_const(cvClassType)); > + > +// Negative tests. > +SA(!__is_const(int)); > +SA(!__is_const(volatile int)); > +SA(!__is_const(ClassType)); > +SA(!__is_const(vClassType)); > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/8] libstdc++: Optimize std::is_const compilation performance 2023-12-23 21:20 [PATCH 0/8] Optimize more type traits Ken Matsui 2023-12-23 21:20 ` [PATCH 1/8] c++: Implement __is_const built-in trait Ken Matsui @ 2023-12-23 21:20 ` Ken Matsui 1 sibling, 0 replies; 4+ messages in thread From: Ken Matsui @ 2023-12-23 21:20 UTC (permalink / raw) To: gcc-patches; +Cc: libstdc++, Ken Matsui This patch optimizes the compilation performance of std::is_const by dispatching to the new __is_const built-in trait. libstdc++-v3/ChangeLog: * include/std/type_traits (is_const): Use __is_const built-in trait. (is_const_v): Likewise. Signed-off-by: Ken Matsui <kmatsui@gcc.gnu.org> --- libstdc++-v3/include/std/type_traits | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index f00c07f94f9..f40831de838 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -835,6 +835,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Type properties. /// is_const +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_const) + template<typename _Tp> + struct is_const + : public __bool_constant<__is_const(_Tp)> + { }; +#else template<typename> struct is_const : public false_type { }; @@ -842,6 +848,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct is_const<_Tp const> : public true_type { }; +#endif /// is_volatile template<typename> @@ -3315,10 +3322,15 @@ template <typename _Tp> inline constexpr bool is_member_pointer_v = is_member_pointer<_Tp>::value; #endif +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_const) +template <typename _Tp> + inline constexpr bool is_const_v = __is_const(_Tp); +#else template <typename _Tp> inline constexpr bool is_const_v = false; template <typename _Tp> inline constexpr bool is_const_v<const _Tp> = true; +#endif #if _GLIBCXX_USE_BUILTIN_TRAIT(__is_function) template <typename _Tp> -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-12-23 21:39 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-12-23 21:20 [PATCH 0/8] Optimize more type traits Ken Matsui 2023-12-23 21:20 ` [PATCH 1/8] c++: Implement __is_const built-in trait Ken Matsui 2023-12-23 21:38 ` Ken Matsui 2023-12-23 21:20 ` [PATCH 2/8] libstdc++: Optimize std::is_const compilation performance Ken Matsui
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).