forked from mirrors/gecko-dev
Bug 1858982 - Fix slow call_ref when the callee performs tail calls. r=rhunt
Differential Revision: https://phabricator.services.mozilla.com/D190942
This commit is contained in:
parent
e80e659cd5
commit
111c066293
2 changed files with 49 additions and 0 deletions
46
js/src/jit-test/tests/wasm/regress/bug1858982.js
Normal file
46
js/src/jit-test/tests/wasm/regress/bug1858982.js
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
// |jit-test| --wasm-tail-calls; --wasm-gc; skip-if: !wasmGcEnabled() || !wasmTailCallsEnabled()
|
||||
|
||||
// Tests if instance registers were restored properly when call_ref is used
|
||||
// with tail calls.
|
||||
var t = wasmEvalText(`(module
|
||||
(type $t1 (func))
|
||||
(func $f0 (param funcref i32 i32 i32 i32 i32 i32 i32 i32 i32)
|
||||
local.get 0
|
||||
ref.cast (ref $t1)
|
||||
return_call_ref $t1
|
||||
)
|
||||
(func $f1 (param i32))
|
||||
(elem declare func $f)
|
||||
(func $f (param funcref)
|
||||
(local i32 i32 i32 i32)
|
||||
local.get 0
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
i32.const 1
|
||||
return_call $f0
|
||||
)
|
||||
(func (export "f") (result funcref)
|
||||
ref.func $f
|
||||
)
|
||||
)`);
|
||||
|
||||
var t2 = wasmEvalText(`(module
|
||||
(import "" "f" (func $fi (result funcref)))
|
||||
(type $t1 (func (param funcref)))
|
||||
(elem declare func $f2)
|
||||
(func $f2)
|
||||
(func (export "test")
|
||||
ref.func $f2
|
||||
call $fi
|
||||
ref.cast (ref $t1)
|
||||
call_ref $t1
|
||||
)
|
||||
)`, {"": {f:t.exports.f},});
|
||||
|
||||
t2.exports.test();
|
||||
|
|
@ -5561,6 +5561,9 @@ void MacroAssembler::wasmCallRef(const wasm::CallSiteDesc& desc,
|
|||
loadPtr(Address(calleeFnObj, uncheckedEntrySlotOffset), calleeScratch);
|
||||
|
||||
*slowCallOffset = call(desc, calleeScratch);
|
||||
#ifdef ENABLE_WASM_TAIL_CALLS
|
||||
wasmMarkSlowCall();
|
||||
#endif
|
||||
|
||||
// Restore registers and realm and back to this caller's.
|
||||
loadPtr(Address(getStackPointer(), WasmCallerInstanceOffsetBeforeCall),
|
||||
|
|
|
|||
Loading…
Reference in a new issue