• 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
..
OWNERS Loading commit data...
block-coverage-builder.h Loading commit data...
bytecode-array-accessor.cc Loading commit data...
bytecode-array-accessor.h Loading commit data...
bytecode-array-builder.cc Loading commit data...
bytecode-array-builder.h Loading commit data...
bytecode-array-iterator.cc Loading commit data...
bytecode-array-iterator.h Loading commit data...
bytecode-array-random-iterator.cc Loading commit data...
bytecode-array-random-iterator.h Loading commit data...
bytecode-array-writer.cc Loading commit data...
bytecode-array-writer.h Loading commit data...
bytecode-decoder.cc Loading commit data...
bytecode-decoder.h Loading commit data...
bytecode-flags.cc Loading commit data...
bytecode-flags.h Loading commit data...
bytecode-generator.cc Loading commit data...
bytecode-generator.h Loading commit data...
bytecode-jump-table.h Loading commit data...
bytecode-label.cc Loading commit data...
bytecode-label.h Loading commit data...
bytecode-node.cc Loading commit data...
bytecode-node.h Loading commit data...
bytecode-operands.cc Loading commit data...
bytecode-operands.h Loading commit data...
bytecode-register-allocator.h Loading commit data...
bytecode-register-optimizer.cc Loading commit data...
bytecode-register-optimizer.h Loading commit data...
bytecode-register.cc Loading commit data...
bytecode-register.h Loading commit data...
bytecode-source-info.cc Loading commit data...
bytecode-source-info.h Loading commit data...
bytecode-traits.h Loading commit data...
bytecodes.cc Loading commit data...
bytecodes.h Loading commit data...
constant-array-builder.cc Loading commit data...
constant-array-builder.h Loading commit data...
control-flow-builders.cc Loading commit data...
control-flow-builders.h Loading commit data...
handler-table-builder.cc Loading commit data...
handler-table-builder.h Loading commit data...
interpreter-assembler.cc Loading commit data...
interpreter-assembler.h Loading commit data...
interpreter-generator.cc Loading commit data...
interpreter-generator.h Loading commit data...
interpreter-intrinsics-generator.cc Loading commit data...
interpreter-intrinsics-generator.h Loading commit data...
interpreter-intrinsics.cc Loading commit data...
interpreter-intrinsics.h Loading commit data...
interpreter.cc Loading commit data...
interpreter.h Loading commit data...