[maglev] Skip generator prologue for empty jump tables

We might generate a SwitchOnGeneratorState bytecode with zero jump table
entries if the JS code only has dead suspension points (where AST
suspensions are emitted, so suspend_count() > 0, but the bytecode for the
suspension ends up not being emitted because it's dead). An example
would be:

    async function() {
      return;
      await 0;
    }

In these cases, we can skip emitting the generator prologue, since the
function is not resumable.

Bug: v8:7700
Change-Id: Ie9f9d4fa8740f4ddc176cd5bbdc5beeda97ba8d5
Fixed: chromium:1370396
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3932946
Reviewed-by: Jakob Linke <jgruber@chromium.org>
Commit-Queue: Jakob Linke <jgruber@chromium.org>
Auto-Submit: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83516}
This commit is contained in:
Leszek Swirski 2022-10-04 15:07:14 +02:00 committed by V8 LUCI CQ
parent 20327d1599
commit 58dcd5a1c2

View File

@ -3223,6 +3223,12 @@ void MaglevGraphBuilder::VisitSwitchOnGeneratorState() {
int generator_prologue_block_offset = block_offset_ + 1;
DCHECK_LT(generator_prologue_block_offset, next_offset());
interpreter::JumpTableTargetOffsets offsets =
iterator_.GetJumpTableTargetOffsets();
// If there are no jump offsets, then this generator is not resumable, which
// means we can skip checking for it and switching on its state.
if (offsets.size() == 0) return;
// We create an initial block that checks if the generator is undefined.
ValueNode* maybe_generator = LoadRegisterTagged(0);
BasicBlock* block_is_generator_undefined = CreateBlock<BranchIfRootConstant>(
@ -3252,9 +3258,6 @@ void MaglevGraphBuilder::VisitSwitchOnGeneratorState() {
interpreter::Register::virtual_accumulator());
// Switch on generator state.
interpreter::JumpTableTargetOffsets offsets =
iterator_.GetJumpTableTargetOffsets();
DCHECK_NE(offsets.size(), 0);
int case_value_base = (*offsets.begin()).case_value;
BasicBlockRef* targets = zone()->NewArray<BasicBlockRef>(offsets.size());
for (interpreter::JumpTableTargetOffset offset : offsets) {