llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Thibault Monnier (Thibault-Monnier)

<details>
<summary>Changes</summary>

... by extracting the check for space character and marking it as 
`LLVM_LIKELY`. This increases performance because the space is by far the most 
common horizontal character, so in most cases, this change allows to replace a 
lookup table check with a simple comparison, reducing latency and helping the 
cache.

This does not reduce instruction count, as a lookup table and a comparison are 
both a single instruction. However, it _does_ reduce cycles in a consistent 
manner, around `0.2` - `0.3`%: 
[benchmark](https://llvm-compile-time-tracker.com/compare.php?from=3192fe2c7b08912cc72c86471a593165b615dc28&amp;to=faa899a6ce518c1176f2bf59f199eb42e59d840e&amp;stat=cycles).
 I tested this locally and am able to confirm this is not noise (at least not 
entirely, it does feel weird that this impacts `O3` more than `O0`...), as I 
achieved almost `2`% faster PP speed in my tests.

---
Full diff: https://github.com/llvm/llvm-project/pull/180819.diff


1 Files Affected:

- (modified) clang/lib/Lex/Lexer.cpp (+4-4) 


``````````diff
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index 1498657047bd6..483cca32e08a2 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -2533,8 +2533,8 @@ bool Lexer::SkipWhitespace(Token &Result, const char 
*CurPtr,
 
   // Skip consecutive spaces efficiently.
   while (true) {
-    // Skip horizontal whitespace very aggressively.
-    while (isHorizontalWhitespace(Char))
+    // Skip horizontal whitespace, especially space, very aggressively.
+    while (LLVM_LIKELY(Char == ' ') || isHorizontalWhitespace(Char))
       Char = *++CurPtr;
 
     // Otherwise if we have something other than whitespace, we're done.
@@ -3756,10 +3756,10 @@ bool Lexer::LexTokenInternal(Token &Result, bool 
TokAtPhysicalStartOfLine) {
   const char *CurPtr = BufferPtr;
 
   // Small amounts of horizontal whitespace is very common between tokens.
-  if (isHorizontalWhitespace(*CurPtr)) {
+  if (LLVM_LIKELY(*CurPtr == ' ') || isHorizontalWhitespace(*CurPtr)) {
     do {
       ++CurPtr;
-    } while (isHorizontalWhitespace(*CurPtr));
+    } while (LLVM_LIKELY(*CurPtr == ' ') || isHorizontalWhitespace(*CurPtr));
 
     // If we are keeping whitespace and other tokens, just return what we just
     // skipped.  The next lexer invocation will return the token after the

``````````

</details>


https://github.com/llvm/llvm-project/pull/180819
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to