Hi all, This patch supersedes yesterday's; it impements autoconf-based detection of compiler builtins.
The purpose of this feature is to give explicit hints to compilers supporting them about the likely outcome of an if() clause; thus allowing the compiler to do explicit optimizations (CPU predictor hinting, code layout optimizations) based on the predicted outcome. The obvious case is the singleton pattern, where the existence check will always be true except for the first time. This work is not correlated to Alex's SMP-inspired cachemgr work. Kinkie
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kin...@squid-cache.org-20101013160855-lmi2vbrokh7e64yl # target_branch: file:///home/kinkie/squid/workspace/squid-trunk-co/ # testament_sha1: 4c48469579bcf0502e4769dd550e3fea76e1e29a # timestamp: 2010-10-13 18:09:02 +0200 # base_revision_id: amosjeffr...@squid-cache.org-20101006130311-\ # xnwwkgwnuhy5oj0r # # Begin patch === modified file 'acinclude/os-deps.m4' --- acinclude/os-deps.m4 2010-08-29 14:07:18 +0000 +++ acinclude/os-deps.m4 2010-10-13 16:08:55 +0000 @@ -814,3 +814,17 @@ squid_cv_resuid_works="no" ],[:]) ) ]) + + +dnl check compiler support for gcc-style conditional branch hinting +dnl set squid_cv_branch_hints to either "no" or "yes" +AC_DEFUN([SQUID_CHECK_GCC_COMPILER_BRANCH_HINTS],[ + AC_CACHE_CHECK(if the compiler supports branch hints, squid_cv_branch_hints, + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[ + int foo=1; + if (__builtin_expect(!!(foo==1), 1)) { + foo=2; + } + ]])],[squid_cv_branch_hints=yes],[squid_cv_branch_hints=no]) + ) +]) === modified file 'configure.in' --- configure.in 2010-10-06 13:03:11 +0000 +++ configure.in 2010-10-13 16:08:55 +0000 @@ -79,6 +79,10 @@ AC_USE_SYSTEM_EXTENSIONS fi +SQUID_CHECK_GCC_COMPILER_BRANCH_HINTS +SQUID_DEFINE_BOOL(HAVE_GCC_BRANCH_HINTS,$squid_cv_branch_hints, + [Defined if the compiler supports gcc-style conditional branch hinting]) + AC_ARG_ENABLE(strict-error-checking, AS_HELP_STRING([--disable-strict-error-checking],[By default squid is compiled with all possible static compiler error-checks enabled. === added file 'include/branch-hints.h' --- include/branch-hints.h 1970-01-01 00:00:00 +0000 +++ include/branch-hints.h 2010-10-13 16:08:55 +0000 @@ -0,0 +1,45 @@ +/* + * branch-hints.h (C) 2009 Francesco Chemolli <kin...@squid-cache.org> + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#ifndef BRANCHHINTS_H_ +#define BRANCHHINTS_H_ + +#include "config.h" + +#if HAVE_GCC_BRANCH_HINTS +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ */ + +#endif /* BRANCHHINTS_H_ */ === modified file 'src/cache_manager.cc' --- src/cache_manager.cc 2010-08-16 11:35:40 +0000 +++ src/cache_manager.cc 2010-10-12 15:42:26 +0000 @@ -33,6 +33,7 @@ * */ +#include "branch-hints.h" #include "CacheManager.h" #include "errorpage.h" #include "HttpReply.h" @@ -478,7 +479,7 @@ CacheManager* CacheManager::GetInstance() { - if (instance == 0) { + if (unlikely(instance == 0)) { debugs(16, 6, "CacheManager::GetInstance: starting cachemanager up"); instance = new CacheManager; } # Begin bundle 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