From b03d043bdc5abb867ef3d937f116dcb576e774e0 Mon Sep 17 00:00:00 2001 From: Clemens Backes Date: Fri, 3 Jan 2025 16:13:32 +0800 Subject: [PATCH] [wasm] Spill all loop inputs before entering loop --- .../v8/src/wasm/baseline/liftoff-assembler.cc | 35 +++++-------------- deps/v8/src/wasm/baseline/liftoff-assembler.h | 6 ++-- deps/v8/src/wasm/baseline/liftoff-compiler.cc | 2 +- 3 files changed, 12 insertions(+), 31 deletions(-) diff --git a/deps/v8/src/wasm/baseline/liftoff-assembler.cc b/deps/v8/src/wasm/baseline/liftoff-assembler.cc index 29120dd0..29ab4714 100644 --- a/deps/v8/src/wasm/baseline/liftoff-assembler.cc +++ b/deps/v8/src/wasm/baseline/liftoff-assembler.cc @@ -764,29 +764,10 @@ void LiftoffAssembler::DropExceptionValueAtOffset(int offset) { cache_state_.stack_state.pop_back(); } -void LiftoffAssembler::PrepareLoopArgs(int num) { - for (int i = 0; i < num; ++i) { - VarState& slot = cache_state_.stack_state.end()[-1 - i]; - if (slot.is_stack()) continue; - RegClass rc = reg_class_for(slot.kind()); - if (slot.is_reg()) { - if (cache_state_.get_use_count(slot.reg()) > 1) { - // If the register is used more than once, we cannot use it for the - // merge. Move it to an unused register instead. - LiftoffRegList pinned; - pinned.set(slot.reg()); - LiftoffRegister dst_reg = GetUnusedRegister(rc, pinned); - Move(dst_reg, slot.reg(), slot.kind()); - cache_state_.dec_used(slot.reg()); - cache_state_.inc_used(dst_reg); - slot.MakeRegister(dst_reg); - } - continue; - } - LiftoffRegister reg = GetUnusedRegister(rc, {}); - LoadConstant(reg, slot.constant()); - slot.MakeRegister(reg); - cache_state_.inc_used(reg); +void LiftoffAssembler::SpillLoopArgs(int num) { + for (VarState& slot : + base::VectorOf(cache_state_.stack_state.end() - num, num)) { + Spill(&slot); } } @@ -978,14 +959,14 @@ void LiftoffAssembler::Spill(VarState* slot) { } void LiftoffAssembler::SpillLocals() { - for (uint32_t i = 0; i < num_locals_; ++i) { - Spill(&cache_state_.stack_state[i]); + for (VarState& local_slot : + base::VectorOf(cache_state_.stack_state.data(), num_locals_)) { + Spill(&local_slot); } } void LiftoffAssembler::SpillAllRegisters() { - for (uint32_t i = 0, e = cache_state_.stack_height(); i < e; ++i) { - auto& slot = cache_state_.stack_state[i]; + for (VarState& slot : cache_state_.stack_state) { if (!slot.is_reg()) continue; Spill(slot.offset(), slot.reg(), slot.kind()); slot.MakeStack(); diff --git a/deps/v8/src/wasm/baseline/liftoff-assembler.h b/deps/v8/src/wasm/baseline/liftoff-assembler.h index aef63c64..d5c3b056 100644 --- a/deps/v8/src/wasm/baseline/liftoff-assembler.h +++ b/deps/v8/src/wasm/baseline/liftoff-assembler.h @@ -549,9 +549,9 @@ class LiftoffAssembler : public MacroAssembler { // the bottom of the stack. void DropExceptionValueAtOffset(int offset); - // Ensure that the loop inputs are either in a register or spilled to the - // stack, so that we can merge different values on the back-edge. - void PrepareLoopArgs(int num); + // Spill all loop inputs to the stack to free registers and to ensure that we + // can merge different values on the back-edge. + void SpillLoopArgs(int num); V8_INLINE static int NextSpillOffset(ValueKind kind, int top_spill_offset) { int offset = top_spill_offset + SlotSizeForType(kind); diff --git a/deps/v8/src/wasm/baseline/liftoff-compiler.cc b/deps/v8/src/wasm/baseline/liftoff-compiler.cc index f0887de7..9aed6ddd 100644 --- a/deps/v8/src/wasm/baseline/liftoff-compiler.cc +++ b/deps/v8/src/wasm/baseline/liftoff-compiler.cc @@ -1262,7 +1262,7 @@ class LiftoffCompiler { // pre-analysis of the function. __ SpillLocals(); - __ PrepareLoopArgs(loop->start_merge.arity); + __ SpillLoopArgs(loop->start_merge.arity); // Loop labels bind at the beginning of the block. __ bind(loop->label.get()); -- 2.43.0