• Seth Brenith's avatar
    Profile-guided optimization of builtins · 922983df
    Seth Brenith authored
    Design doc:
    https://docs.google.com/document/d/1szInbXZfaErWW70d30hJsOLL0Es-l5_g8d2rXm1ZBqI/edit?usp=sharing
    
    V8 can already collect data about how many times each basic block in the
    builtins is run. This change enables using that data for profile-guided
    optimization. New comments in BUILD.gn describe how to use this feature.
    
    A few implementation details worth mentioning, which aren't covered in
    the design doc:
    
    - BasicBlockProfilerData currently contains an array of RPO numbers.
      However, this array is always just [0, 1, 2, 3, ...], so this change
      removes that array. A new DCHECK in BasicBlockInstrumentor::Instrument
      ensures that the removal is valid.
    
    - RPO numbers, while useful for printing data that matches with the
      stringified schedule, are not useful for matching profiling data with
      blocks that haven't been scheduled yet. This change adds a new array
      of block IDs in BasicBlockProfilerData, so that block counters can be
      used for PGO.
    
    - Basic block counters need to be written to a file so that they can be
      provided to a subsequent run of mksnapshot, but the design doc doesn't
      specify the transfer format or what file is used. In this change, I
      propose using the existing v8.log file for that purpose. Block count
      records look like this:
    
      block,TestLessThanHandler,37,29405
    
      This line indicates that block ID 37 in TestLessThanHandler was run
      29405 times. If multiple lines refer to the same block, the reader
      adds them all together. I like this format because it's easy to use:
      - V8 already has robust logic for creating the log file, naming it to
        avoid conflicts in multi-process situations, etc.
      - Line order doesn't matter, and interleaved writes from various
        logging sources are fine, given that V8 writes each line atomically.
      - Combining multiple sources of profiling data is as simple as
        concatenating their v8.log files together.
    
    - It is a good idea to avoid making any changes based on profiling data
      if the function being compiled doesn't match the one that was
      profiled, since it is common to use profiling data downloaded from a
      central lab which is updated only periodically. To check whether a
      function matches, I propose using a hash of the Graph state right
      before scheduling. This might be stricter than necessary, as some
      changes to the function might be small enough that the profile data is
      still relevant, but I'd rather err on the side of not making incorrect
      changes. This hash is also written to the v8.log file, in a line that
      looks like this:
    
      builtin_hash,LdaZeroHandler,3387822046
    
    Bug: v8:10470
    Change-Id: I429e5ce5efa94e01e7489deb3996012cf860cf13
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2220765
    Commit-Queue: Seth Brenith <seth.brenith@microsoft.com>
    Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
    Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#69008}
    922983df
Name
Last commit
Last update
..
api Loading commit data...
asmjs Loading commit data...
ast Loading commit data...
base Loading commit data...
builtins Loading commit data...
codegen Loading commit data...
common Loading commit data...
compiler Loading commit data...
compiler-dispatcher Loading commit data...
d8 Loading commit data...
date Loading commit data...
debug Loading commit data...
deoptimizer Loading commit data...
diagnostics Loading commit data...
execution Loading commit data...
extensions Loading commit data...
flags Loading commit data...
handles Loading commit data...
heap Loading commit data...
ic Loading commit data...
init Loading commit data...
inspector Loading commit data...
interpreter Loading commit data...
json Loading commit data...
libplatform Loading commit data...
libsampler Loading commit data...
logging Loading commit data...
numbers Loading commit data...
objects Loading commit data...
parsing Loading commit data...
profiler Loading commit data...
protobuf Loading commit data...
regexp Loading commit data...
roots Loading commit data...
runtime Loading commit data...
sanitizer Loading commit data...
snapshot Loading commit data...
strings Loading commit data...
tasks Loading commit data...
third_party Loading commit data...
torque Loading commit data...
tracing Loading commit data...
trap-handler Loading commit data...
utils Loading commit data...
wasm Loading commit data...
zone Loading commit data...
DEPS Loading commit data...
OWNERS Loading commit data...