102 lines
4.0 KiB
Diff
102 lines
4.0 KiB
Diff
|
|
From b03d043bdc5abb867ef3d937f116dcb576e774e0 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Clemens Backes <clemensb@chromium.org>
|
||
|
|
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
|
||
|
|
|