summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/StringRef.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2015-09-10 06:07:03 +0000
committerChandler Carruth <chandlerc@gmail.com>2015-09-10 06:07:03 +0000
commit477121721bd8b103d2785f5fdf3f110e54dc0e54 (patch)
treee76a7e758f6b8bc8af9fb60afdea53e5a03f4d9b /llvm/lib/Support/StringRef.cpp
parent93d5d3b5dbf9c01b60c41136482668e38e5a3806 (diff)
downloadbcm5719-llvm-477121721bd8b103d2785f5fdf3f110e54dc0e54.tar.gz
bcm5719-llvm-477121721bd8b103d2785f5fdf3f110e54dc0e54.zip
[ADT] Add a single-character version of the small vector split routine
on StringRef. Finding and splitting on a single character is substantially faster than doing it on even a single character StringRef -- we immediately get to a *very* tuned memchr call this way. Even nicer, we get to this even in a debug build, shaving 18% off the runtime of TripleTest.Normalization, helping PR23676 some more. llvm-svn: 247244
Diffstat (limited to 'llvm/lib/Support/StringRef.cpp')
-rw-r--r--llvm/lib/Support/StringRef.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Support/StringRef.cpp b/llvm/lib/Support/StringRef.cpp
index ddece087a9e..f2e587cb527 100644
--- a/llvm/lib/Support/StringRef.cpp
+++ b/llvm/lib/Support/StringRef.cpp
@@ -294,6 +294,26 @@ void StringRef::split(SmallVectorImpl<StringRef> &A,
A.push_back(rest);
}
+void StringRef::split(SmallVectorImpl<StringRef> &A, char Separator,
+ int MaxSplit, bool KeepEmpty) const {
+ StringRef rest = *this;
+
+ // rest.data() is used to distinguish cases like "a," that splits into
+ // "a" + "" and "a" that splits into "a" + 0.
+ for (int splits = 0;
+ rest.data() != nullptr && (MaxSplit < 0 || splits < MaxSplit);
+ ++splits) {
+ std::pair<StringRef, StringRef> p = rest.split(Separator);
+
+ if (KeepEmpty || p.first.size() != 0)
+ A.push_back(p.first);
+ rest = p.second;
+ }
+ // If we have a tail left, add it.
+ if (rest.data() != nullptr && (rest.size() != 0 || KeepEmpty))
+ A.push_back(rest);
+}
+
//===----------------------------------------------------------------------===//
// Helpful Algorithms
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud