[llvm] r176766 - TLI: Microoptimize calls to strlen+memcmp to strncmp.
Benjamin Kramer
benny.kra at gmail.com
Wed Mar 13 06:52:08 PDT 2013
On 13.03.2013, at 14:42, Anton Yartsev <anton.yartsev at gmail.com> wrote:
> Hi Benjamin,
>
> I failed to compile Clang after this change. VS2008 complains:
Does r176946 help? This behavior of MSVC violates C++03 and is really annoying :(
- Ben
>
> 1>------ Build started: Project: LLVMTarget, Configuration: Debug Win32 ------
> 1>Compiling...
> 1>TargetLibraryInfo.cpp
> 1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(346) : error C2666: '`anonymous-namespace'::StringComparator::operator ()' : 3 overloads have similar conversions
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(604): could be 'bool `anonymous-namespace'::StringComparator::operator ()(const char *,llvm::StringRef) const'
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(611): or 'bool `anonymous-namespace'::StringComparator::operator ()(llvm::StringRef,const char *) const'
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(612): or 'bool `anonymous-namespace'::StringComparator::operator ()(llvm::StringRef,llvm::StringRef) const'
> 1> while trying to match the argument list '(const char *, const char *)'
> 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(1699) : see reference to function template instantiation 'bool std::_Debug_lt_pred<_Pr,const char*,const char*>(_Pr,_Ty1 &,_Ty2 &,const wchar_t *,unsigned int)' being compiled
> 1> with
> 1> [
> 1> _Pr=`anonymous-namespace'::StringComparator,
> 1> _Ty1=const char *,
> 1> _Ty2=const char *
> 1> ]
> 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(1709) : see reference to function template instantiation 'void std::_Debug_order_single2<_InIt,_Pr>(_FwdIt,_FwdIt,_Pr,bool,const wchar_t *,unsigned int,std::forward_iterator_tag)' being compiled
> 1> with
> 1> [
> 1> _InIt=const char **,
> 1> _Pr=`anonymous-namespace'::StringComparator,
> 1> _FwdIt=const char **
> 1> ]
> 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\algorithm(2290) : see reference to function template instantiation 'void std::_Debug_order_single<_FwdIt,_Pr>(_InIt,_InIt,_Pr,bool,const wchar_t *,unsigned int)' being compiled
> 1> with
> 1> [
> 1> _FwdIt=const char **,
> 1> _Pr=`anonymous-namespace'::StringComparator,
> 1> _InIt=const char **
> 1> ]
> 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\algorithm(2314) : see reference to function template instantiation '_FwdIt std::_Lower_bound<const char**,_Ty,std::iterator_traits<_Iter>::difference_type,_Pr>(_FwdIt,_FwdIt,const _Ty &,_Pr,_Diff *)' being compiled
> 1> with
> 1> [
> 1> _FwdIt=const char **,
> 1> _Ty=llvm::StringRef,
> 1> _Iter=const char **,
> 1> _Pr=`anonymous-namespace'::StringComparator,
> 1> _Diff=std::iterator_traits<const char **>::difference_type
> 1> ]
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(630) : see reference to function template instantiation '_FwdIt std::lower_bound<const char**,llvm::StringRef,`anonymous-namespace'::StringComparator>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
> 1> with
> 1> [
> 1> _FwdIt=const char **,
> 1> _Ty=llvm::StringRef,
> 1> _Pr=`anonymous-namespace'::StringComparator
> 1> ]
> 1>C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(348) : error C2666: '`anonymous-namespace'::StringComparator::operator ()' : 3 overloads have similar conversions
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(604): could be 'bool `anonymous-namespace'::StringComparator::operator ()(const char *,llvm::StringRef) const'
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(611): or 'bool `anonymous-namespace'::StringComparator::operator ()(llvm::StringRef,const char *) const'
> 1> ..\..\..\lib\Target\TargetLibraryInfo.cpp(612): or 'bool `anonymous-namespace'::StringComparator::operator ()(llvm::StringRef,llvm::StringRef) const'
> 1> while trying to match the argument list '(const char *, const char *)'
> 1>Build log was saved at "file://f:\llvm_COMMON\-VS_build-\lib\Target\LLVMTarget.dir\Debug\BuildLog.htm"
> 1>LLVMTarget - 2 error(s), 0 warning(s)
>
>> Author: d0k
>> Date: Sat Mar 9 07:48:23 2013
>> New Revision: 176766
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=176766&view=rev
>> Log:
>> TLI: Microoptimize calls to strlen+memcmp to strncmp.
>>
>> The strlen+memcmp was hidden in a call to StringRef::operator==. We check if
>> there are any null bytes in the string upfront so we can simplify the comparison
>> Small speedup when compiling code with many function calls.
>>
>> Modified:
>> llvm/trunk/lib/Target/TargetLibraryInfo.cpp
>>
>> Modified: llvm/trunk/lib/Target/TargetLibraryInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetLibraryInfo.cpp?rev=176766&r1=176765&r2=176766&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/TargetLibraryInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/TargetLibraryInfo.cpp Sat Mar 9 07:48:23 2013
>> @@ -597,15 +597,37 @@ TargetLibraryInfo::TargetLibraryInfo(con
>> CustomNames = TLI.CustomNames;
>> }
>> +namespace {
>> +struct StringComparator {
>> + /// Compare two strings and return true if LHS is lexicographically less than
>> + /// RHS. Requires that RHS doesn't contain any zero bytes.
>> + bool operator()(const char *LHS, StringRef RHS) const {
>> + // Compare prefixes with strncmp. If prefixes match we know that LHS is
>> + // greater or equal to RHS as RHS can't contain any '\0'.
>> + return std::strncmp(LHS, RHS.data(), RHS.size()) < 0;
>> + }
>> +
>> + // Provided for compatibility with MSVC's debug mode.
>> + bool operator()(StringRef LHS, const char *RHS) const { return LHS < RHS; }
>> + bool operator()(StringRef LHS, StringRef RHS) const { return LHS < RHS; }
>> +};
>> +}
>> +
>> bool TargetLibraryInfo::getLibFunc(StringRef funcName,
>> LibFunc::Func &F) const {
>> const char **Start = &StandardNames[0];
>> const char **End = &StandardNames[LibFunc::NumLibFuncs];
>> +
>> + // Filter out empty names and names containing null bytes, those can't be in
>> + // our table.
>> + if (funcName.empty() || funcName.find('\0') != StringRef::npos)
>> + return false;
>> +
>> // Check for \01 prefix that is used to mangle __asm declarations and
>> // strip it if present.
>> - if (!funcName.empty() && funcName.front() == '\01')
>> + if (funcName.front() == '\01')
>> funcName = funcName.substr(1);
>> - const char **I = std::lower_bound(Start, End, funcName);
>> + const char **I = std::lower_bound(Start, End, funcName, StringComparator());
>> if (I != End && *I == funcName) {
>> F = (LibFunc::Func)(I - Start);
>> return true;
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> --
> Anton
>
More information about the llvm-commits
mailing list