From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id E44393858005 for ; Wed, 5 Jan 2022 13:48:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E44393858005 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-302-06w-hwRbPNizgnNxlAIbrg-1; Wed, 05 Jan 2022 08:48:01 -0500 X-MC-Unique: 06w-hwRbPNizgnNxlAIbrg-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C209F1006AA5; Wed, 5 Jan 2022 13:48:00 +0000 (UTC) Received: from localhost (unknown [10.33.36.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6FF347744C; Wed, 5 Jan 2022 13:48:00 +0000 (UTC) From: Jonathan Wakely To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Reduce template instantiations in Date: Wed, 5 Jan 2022 13:47:59 +0000 Message-Id: <20220105134759.1639818-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-13.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Jan 2022 13:48:09 -0000 Tested powerpc64le-linux, pushed to trunk. This moves the last two template parameters of __regex_algo_impl to be runtime function parameters instead, so that we don't need four different instantiations for the possible ways to call it. Most of the function (and what it instantiates) is the same in all cases, so making them compile-time choices doesn't really have much benefit. Use 'if constexpr' for conditions that check template parameters, so that when we do depend on a compile-time condition we only instantiate what we need to. libstdc++-v3/ChangeLog: * include/bits/regex.h (__regex_algo_impl): Change __policy and __match_mode template parameters to be function parameters. (regex_match, regex_search): Pass policy and match mode as function arguments. * include/bits/regex.tcc (__regex_algo_impl): Change template parameters to function parameters. * include/bits/regex_compiler.h (_RegexTranslatorBase): Use 'if constexpr' for conditions using template parameters. (_RegexTranslator): Likewise. * include/bits/regex_executor.tcc (_Executor::_M_handle_accept): Likewise. * testsuite/util/testsuite_regex.h (regex_match_debug) (regex_search_debug): Move template arguments to function arguments. --- libstdc++-v3/include/bits/regex.h | 33 +++++++++---------- libstdc++-v3/include/bits/regex.tcc | 8 ++--- libstdc++-v3/include/bits/regex_compiler.h | 9 ++--- libstdc++-v3/include/bits/regex_executor.tcc | 2 +- libstdc++-v3/testsuite/util/testsuite_regex.h | 24 +++++++------- 5 files changed, 37 insertions(+), 39 deletions(-) diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index ff09f49f9e8..7480b0a5f97 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -45,15 +45,14 @@ namespace __detail enum class _RegexExecutorPolicy : int { _S_auto, _S_alternate }; template + typename _CharT, typename _TraitsT> bool - __regex_algo_impl(_BiIter __s, - _BiIter __e, + __regex_algo_impl(_BiIter __s, _BiIter __e, match_results<_BiIter, _Alloc>& __m, const basic_regex<_CharT, _TraitsT>& __re, - regex_constants::match_flag_type __flags); + regex_constants::match_flag_type __flags, + _RegexExecutorPolicy __policy, + bool __match_mode); template class _Executor; @@ -792,12 +791,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _M_flags = __f; } - template + template friend bool __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Rp>&, - regex_constants::match_flag_type); + regex_constants::match_flag_type, + _RegexExecutorPolicy, bool); template friend class __detail::_Executor; @@ -2063,12 +2062,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 template friend class __detail::_Executor; - template + template friend bool __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Rp>&, - regex_constants::match_flag_type); + regex_constants::match_flag_type, + _RegexExecutorPolicy, bool); // Reset contents to __size unmatched sub_match objects // (plus additional objects for prefix, suffix and unmatched sub). @@ -2206,9 +2205,8 @@ _GLIBCXX_END_NAMESPACE_CXX11 regex_constants::match_flag_type __flags = regex_constants::match_default) { - return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - __detail::_RegexExecutorPolicy::_S_auto, true> - (__s, __e, __m, __re, __flags); + return __detail::__regex_algo_impl(__s, __e, __m, __re, __flags, + __detail::_RegexExecutorPolicy::_S_auto, true); } /** @@ -2363,9 +2361,8 @@ _GLIBCXX_END_NAMESPACE_CXX11 regex_constants::match_flag_type __flags = regex_constants::match_default) { - return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - __detail::_RegexExecutorPolicy::_S_auto, false> - (__s, __e, __m, __re, __flags); + return __detail::__regex_algo_impl(__s, __e, __m, __re, __flags, + __detail::_RegexExecutorPolicy::_S_auto, false); } /** diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc index 7d720ca7b42..2b90b04c560 100644 --- a/libstdc++-v3/include/bits/regex.tcc +++ b/libstdc++-v3/include/bits/regex.tcc @@ -43,15 +43,15 @@ namespace __detail // // That __match_mode is true means regex_match, else regex_search. template + typename _CharT, typename _TraitsT> bool __regex_algo_impl(_BiIter __s, _BiIter __e, match_results<_BiIter, _Alloc>& __m, const basic_regex<_CharT, _TraitsT>& __re, - regex_constants::match_flag_type __flags) + regex_constants::match_flag_type __flags, + _RegexExecutorPolicy __policy, + bool __match_mode) { if (__re._M_automaton == nullptr) return false; diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h index 6a9af358c4b..174aefe75f7 100644 --- a/libstdc++-v3/include/bits/regex_compiler.h +++ b/libstdc++-v3/include/bits/regex_compiler.h @@ -221,9 +221,9 @@ namespace __detail _CharT _M_translate(_CharT __ch) const { - if (__icase) + if _GLIBCXX17_CONSTEXPR (__icase) return _M_traits.translate_nocase(__ch); - else if (__collate) + else if _GLIBCXX17_CONSTEXPR (__collate) return _M_traits.translate(__ch); else return __ch; @@ -285,9 +285,10 @@ namespace __detail bool _M_match_range(_CharT __first, _CharT __last, _CharT __ch) const { - if (!__icase) + if _GLIBCXX17_CONSTEXPR (!__icase) return __first <= __ch && __ch <= __last; - return this->_M_in_range_icase(__first, __last, __ch); + else + return this->_M_in_range_icase(__first, __last, __ch); } }; diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc index b3e2726a55f..b93e958075e 100644 --- a/libstdc++-v3/include/bits/regex_executor.tcc +++ b/libstdc++-v3/include/bits/regex_executor.tcc @@ -425,7 +425,7 @@ namespace __detail void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>:: _M_handle_accept(_Match_mode __match_mode, _StateIdT) { - if (__dfs_mode) + if _GLIBCXX17_CONSTEXPR (__dfs_mode) { __glibcxx_assert(!_M_has_sol); if (__match_mode == _Match_mode::_Exact) diff --git a/libstdc++-v3/testsuite/util/testsuite_regex.h b/libstdc++-v3/testsuite/util/testsuite_regex.h index f2bb068024d..4e163c3a3f8 100644 --- a/libstdc++-v3/testsuite/util/testsuite_regex.h +++ b/libstdc++-v3/testsuite/util/testsuite_regex.h @@ -143,13 +143,13 @@ namespace __gnu_test = std::regex_constants::match_default) { using namespace std::__detail; - auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - _RegexExecutorPolicy::_S_auto, true> - (__s, __e, __m, __re, __flags); + auto __res1 = __regex_algo_impl(__s, __e, __m, __re, __flags, + _RegexExecutorPolicy::_S_auto, + true); match_results<_Bi_iter, _Alloc> __mm; - auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - _RegexExecutorPolicy::_S_alternate, true> - (__s, __e, __mm, __re, __flags); + auto __res2 = __regex_algo_impl(__s, __e, __mm, __re, __flags, + _RegexExecutorPolicy::_S_alternate, + true); if (__res1 == __res2 && __m == __mm) return __res1; throw std::exception(); @@ -229,13 +229,13 @@ namespace __gnu_test = std::regex_constants::match_default) { using namespace std::__detail; - auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - _RegexExecutorPolicy::_S_auto, false> - (__s, __e, __m, __re, __flags); + auto __res1 = __regex_algo_impl(__s, __e, __m, __re, __flags, + _RegexExecutorPolicy::_S_auto, + false); match_results<_Bi_iter, _Alloc> __mm; - auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, - _RegexExecutorPolicy::_S_alternate, false> - (__s, __e, __mm, __re, __flags); + auto __res2 = __regex_algo_impl(__s, __e, __mm, __re, __flags, + _RegexExecutorPolicy::_S_alternate, + false); if (__res1 == __res2 && __m == __mm) return __res1; throw(std::exception()); // Let test fail. Give it a name. -- 2.31.1