From 7f58c41dbad3584c8dc50cd2d1e82632b7943fd9 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sat, 21 Mar 2015 16:42:35 +0000 Subject: [PATCH] StringRef: Just forward StringRef::find to libc's memchr. Modern libc's have an SSE version of memchr which is a lot faster than our hand-rolled version. In the past I was reluctant to use it because Darwin's memchr used a naive ridiculously slow implementation, but that has been fixed some versions ago. Should have zero functional impact. llvm-svn: 232898 --- llvm/include/llvm/ADT/StringRef.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h index 6111c42..95660a4 100644 --- a/llvm/include/llvm/ADT/StringRef.h +++ b/llvm/include/llvm/ADT/StringRef.h @@ -238,9 +238,12 @@ namespace llvm { /// \returns The index of the first occurrence of \p C, or npos if not /// found. size_t find(char C, size_t From = 0) const { - for (size_t i = std::min(From, Length), e = Length; i != e; ++i) - if (Data[i] == C) - return i; + size_t FindBegin = std::min(From, Length); + if (FindBegin < Length) { // Avoid calling memchr with nullptr. + // Just forward to memchr, which is faster than a hand-rolled loop. + if (const void *P = ::memchr(Data + FindBegin, C, Length - FindBegin)) + return static_cast(P) - Data; + } return npos; } -- 2.7.4