[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:
parent
20327d1599
commit
58dcd5a1c2
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user