InclusionRewriter on Windows (CRLF line endings) will exercise this in a
hot path. Calling memcmp repeatedly would be highly suboptimal for that
use case, so give it a specialized path.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
(Carried over from D133658)
A note that the N=2 search code is mostly mirrored from glibc; I believe it's short enough to not cause copyright issues but please let me know if I should be more defensive here.
| llvm/lib/Support/StringRef.cpp | ||
|---|---|---|
| 165 | How does this compare to just the following? do {
if (std::memcmp(Start, Needle, 2) == 0)
return Start - Data;
++Start;
} while (Start < Stop);
return npos;Much easier to read, and the performance is probably competitive. | |
| llvm/lib/Support/StringRef.cpp | ||
|---|---|---|
| 165 | Thanks, memcmp is not as fast (always loads the Needle in the loop and loads 2 byte of Start instead of 1) but it should still provide sufficient benefit from inline expansion, so I've adopted the strategy. | |
LGTM
| llvm/lib/Support/StringRef.cpp | ||
|---|---|---|
| 174 | As a future optimization, we could also look at making StringRef::count cache BadCharSkip. | |
I don’t have commit rights, so can anyone commit this and https://reviews.llvm.org/D133658?
How does this compare to just the following?
do { if (std::memcmp(Start, Needle, 2) == 0) return Start - Data; ++Start; } while (Start < Stop); return npos;Much easier to read, and the performance is probably competitive.