• Leszek Swirski's avatar
    [ignition] More accurate dead statement elision · 74125939
    Leszek Swirski authored
    The Ignition statement list visitor will skip the rest of the
    statements in the list if it hits a jump statement (like a return
    or break), as the rest of the code in the list can be considered
    dead.
    
        return;
        dead_call(); // skipped
    
    However, since this is at an AST node level, it does not take into
    account condition shortcutting:
    
        if(2.2) return;
        dead_call(); // not skipped
    
    There is also a second dead code elimination in Ignition compilation, at
    the bytecode array writer level, where a bytecodes are not emitted if an
    "exit" bytecode (Return, Jump, or a few others) has been written, until
    the next basic block starts (i.e. a Bind).
    
    This can cause an issue with statements that resurrect the bytecode
    array writer part-way through their visit. An example is try-catch
    statements, which save the context to a register, and then Bind to start
    the try region.
    
    For the case:
    
        if (2.2) return;
        try {     // try statement not skipped
            ...
        }
    
    the bytecode writer is called with
    
        OutputReturn()             // exit bytecode seen
        OutputMove(<context>, r1)  // not emitted
        Bind(&try_begin)           // starts new basic block
        // try body
    
    So, the try is emitted, but without saving the context to a register.
    This means that the liveness analysis sees the read of that register
    (as the output liveness of throwing bytecodes), but does not have a
    write to the register, which means that the liveness escapes.
    
    This patch fixes this by using the bytecode array writer dead-code
    elimination (i.e. "exit bytecode seen") to inform the statement list
    visitor, so that in this example the try statement is not visited at
    all.
    
    Bug: chromium:902395
    Change-Id: Ieb8e46a4318df3edbac0ae17235e0ce8fba12ee3
    Reviewed-on: https://chromium-review.googlesource.com/c/1322951Reviewed-by: 's avatarMythri Alle <mythria@chromium.org>
    Commit-Queue: Leszek Swirski <leszeks@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#57350}
    74125939
Name
Last commit
Last update
benchmarks 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...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
ChangeLog Loading commit data...
DEPS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
LICENSE.valgrind Loading commit data...
OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...
snapshot_toolchain.gni Loading commit data...