• Leszek Swirski's avatar
    [maglev] Fix lifetime extension of generator values · dd6fa2d1
    Leszek Swirski authored
    Loop used value lifetimes extension extends the lifetime of anything
    used inside of a loop but defined outside of it, to make sure that it is
    considered 'live' for the entire body of the loop (this is so that we
    don't e.g. clobber their stack slots with stack slot reuse).
    
    The implementation works on the principle that a) basic blocks are
    topologically sorted by forward control flow, and b) loops are
    irreducible. This means that basic blocks between a loop header and the
    jump to that loop header are inside the loop, and nodes whose id
    preceeds the loop header's id must be before the loop.
    
    Generator resumes break this irreducibility by jumping into the middle
    of loops. This is principally not a problem for the above lifetime
    extension, it just means that the loop's used nodes will overapproximate
    and include these generator nodes. However, there was an implicit
    additional assumption that the node must be loadable by the loop end, to
    extend its lifetime. This fails for the generator resume case, because
    it's possible that the node didn't make it into any loop merge state,
    e.g. because the resume would immediately deopt or return, e.g.
    
                     Start
                     /   \
                    /   GeneratorResume
                    |         |
                    v         |
               .>Loop header  |
              |     |         |
              |   Branch      |
              |   |    |      |
              |   |  Suspend  |
              |   |           |
              |   |  Resume <-'
              |   |    |
              |   |  Return
              |   v
              `--JumpLoop
    
    Here the Resume will get the accumulator from the generator and the
    Return will use it, which will be seen as an out-of-loop use of the
    generator, but the generator was never reachable from the "real" loop
    body.
    
    At the end of the day, since there are no actual uses of the generator
    value in the loop body, the lifetime extension does no harm; all that
    fails is a DCHECK that the values loop lifetime extension extends are
    actually loadable. So, we can relax this DCHECK for this specific
    generator edge case, by checking for whether the JumpLoop is reachable
    from the generator resume.
    
    Bug: v8:7700
    Change-Id: Iec4db2aee5b8812de61c3afb9004c8be3982baa2
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3890975
    Auto-Submit: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarJakob Linke <jgruber@chromium.org>
    Commit-Queue: Jakob Linke <jgruber@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#83144}
    dd6fa2d1
Name
Last commit
Last update
.github Loading commit data...
bazel Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.bazelrc Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.flake8 Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.mailmap Loading commit data...
.style.yapf Loading commit data...
.vpython Loading commit data...
.vpython3 Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.bazel Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
COMMON_OWNERS Loading commit data...
DEPS Loading commit data...
DIR_METADATA Loading commit data...
ENG_REVIEW_OWNERS Loading commit data...
INFRA_OWNERS Loading commit data...
INTL_OWNERS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LOONG_OWNERS Loading commit data...
MIPS_OWNERS Loading commit data...
OWNERS Loading commit data...
PPC_OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
RISCV_OWNERS Loading commit data...
S390_OWNERS Loading commit data...
WATCHLISTS Loading commit data...
WORKSPACE Loading commit data...
codereview.settings Loading commit data...