[PATCH] D137960: [Lexer] Speedup LexTokenInternal
serge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 14 09:46:32 PST 2022
serge-sans-paille created this revision.
serge-sans-paille added reviewers: lattner, nikic.
Herald added a project: All.
serge-sans-paille requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Only reset "NeedsCleaning" flag in case of re-entrant call.
Do not needlessly blank IdentifierInfo. This information will be set
once the token type is picked.
This yields a nice 1% speedup when pre-processing sqlite amalgamation
through:
valgrind --tool=callgrind ./bin/clang -E sqlite3.c -o/dev/null
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D137960
Files:
clang/lib/Lex/Lexer.cpp
Index: clang/lib/Lex/Lexer.cpp
===================================================================
--- clang/lib/Lex/Lexer.cpp
+++ clang/lib/Lex/Lexer.cpp
@@ -3516,10 +3516,8 @@
/// token, not a normal token, as such, it is an internal interface. It assumes
/// that the Flags of result have been cleared before calling this.
bool Lexer::LexTokenInternal(Token &Result, bool TokAtPhysicalStartOfLine) {
-LexNextToken:
- // New token, can't need cleaning yet.
- Result.clearFlag(Token::NeedsCleaning);
- Result.setIdentifierInfo(nullptr);
+LexStart:
+ assert(!Result.needsCleaning() && "Result doesn't need cleaning");
// CurPtr - Cache BufferPtr in an automatic variable.
const char *CurPtr = BufferPtr;
@@ -4141,8 +4139,9 @@
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
} else if (Char == '|') {
// If this is '|||||||' and we're in a conflict marker, ignore it.
- if (CurPtr[1] == '|' && HandleEndOfConflictMarker(CurPtr-1))
+ if (CurPtr[1] == '|' && HandleEndOfConflictMarker(CurPtr - 1)) {
goto LexNextToken;
+ }
Kind = tok::pipepipe;
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
} else {
@@ -4170,8 +4169,9 @@
Char = getCharAndSize(CurPtr, SizeTmp);
if (Char == '=') {
// If this is '====' and we're in a conflict marker, ignore it.
- if (CurPtr[1] == '=' && HandleEndOfConflictMarker(CurPtr-1))
+ if (CurPtr[1] == '=' && HandleEndOfConflictMarker(CurPtr - 1)) {
goto LexNextToken;
+ }
Kind = tok::equalequal;
CurPtr = ConsumeChar(CurPtr, SizeTmp, Result);
@@ -4301,6 +4301,10 @@
// We parsed the directive; lex a token with the new state.
return false;
+
+LexNextToken:
+ Result.clearFlag(Token::NeedsCleaning);
+ goto LexStart;
}
const char *Lexer::convertDependencyDirectiveToken(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137960.475181.patch
Type: text/x-patch
Size: 1842 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221114/7dc9691a/attachment.bin>
More information about the cfe-commits
mailing list