• Leszek Swirski's avatar
    [maglev] Fix result regalloc clobbering inputs · dc92fe09
    Leszek Swirski authored
    Consider the following
    
      * A ValueNode has inputs A and B
      * Input A has later uses, input B doesn't
      * The ValueNode's result must be in the same register as A
    
    It can then happen that UpdateUses frees B, and the result allocation
    emits a gap move from A's register to B's old register (now free) to
    preserve the value of A when the ValueNode writes into its register.
    This gap move is emmitted before the ValueNode start, which means that
    it clobbers B.
    
    Now, UpdateUses only clears registers _after_ node result allocation, so
    that the known free registers are still the ones before updating uses.
    
    Done naively, this would have bad consequences -- in the case where A
    has no later uses, it would still force the regalloc to save its value
    thinking that it is still live. So, this patch also introduces a concept
    of "AllocationStage" where we're either allocating at the start or end
    of a Node. Inputs are allocated at the start, results at the end. When
    walking registers during an allocation, nodes whose lifetimes end at the
    current node are considered to be dead at the "end" allocation stage,
    and we are allowed to a) use their registers, and b) drop them without
    preserving their value.
    
    Bug: v8:7700
    Change-Id: I5ca764ed04b12269f189577e81eb7e2a27cd1b09
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3625978
    Auto-Submit: Leszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
    Commit-Queue: Toon Verwaest <verwaest@chromium.org>
    Cr-Commit-Position: refs/heads/main@{#80371}
    dc92fe09
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...