[PATCH] D120334: [NFC][Lexer] Use more appropriate LangOptionsBase type for Lexer::LangOpts

Dawid Jurczak via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 22 08:38:19 PST 2022


yurai007 created this revision.
yurai007 added reviewers: xbolva00, nikic, serge-sans-paille, aeubanks, jansvoboda11, ymandel, cor3ntin.
yurai007 requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This change can be seen as code cleanup but motivation is more performance related.
While browsing perf reports captured during Linux build we can notice unusual portion of instructions executed in std::vector<std::string> copy constructor like:

  
  0.59%     0.58%  clang-14    clang-14      [.] std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
                                                                  std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::vector


or even:

      
  1.42%     0.26%  clang    clang-14             [.] clang::LangOptions::LangOptions
         |
          --1.16%--clang::LangOptions::LangOptions
                    |
                     --0.74%--std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
                              std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::vector
      

After more digging we can see that relevant LangOptions std::vector members (*Files, ModuleFeatures and NoBuiltinFuncs)
are constructed when Lexer::LangOpts field is initialized on list:

  
  Lexer::Lexer(..., const LangOptions &langOpts, ...)
              : ..., LangOpts(langOpts),


Since LangOptions copy constructor is called by Lexer(..., const LangOptions &LangOpts,...) and local Lexer objects are created thousands times
(in Lexer::getRawToken, Preprocessor::EnterSourceFile and more) during single module processing in frontend it makes std::vector copy constructors surprisingly hot.

      

Unfortunately even though in current Lexer implementation mentioned std::vector members are unused and most of time empty,
no compiler is smart enough to optimize their std::vector copy constructors out (take a look at test assembly): https://godbolt.org/z/hdoxPfMYY even with LTO enabled.
However there is simple way to fix this. Since Lexer doesn't access *Files, ModuleFeatures, NoBuiltinFuncs and any other LangOptions fields (but only LangOptionsBase)
we can simply get rid of redundant copy constructor assembly by changing LangOpts type to more appropriate LangOptionsBase class https://godbolt.org/z/bj9sodxdo

      

After this change I can see more then 1% speedup in some of my microbenchmarks when using Clang release binary built with LTO.
For Linux build gains are not so significant but still nice at the level of -0.4%/-0.5% instructions drop.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D120334

Files:
  clang/include/clang/Lex/Lexer.h
  clang/include/clang/Lex/LiteralSupport.h
  clang/lib/Lex/Lexer.cpp
  clang/lib/Lex/LiteralSupport.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D120334.410548.patch
Type: text/x-patch
Size: 28127 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220222/e75e017f/attachment-0001.bin>


More information about the cfe-commits mailing list