summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2021-10-06 18:29:05 +0200
committerRickard Green <rickard@erlang.org>2021-10-06 18:29:05 +0200
commit2f3396278bdbebafe18bd5eb81ea46e2d0e63d91 (patch)
treea040745d444290ef0fa3bbcf46fcf91d1868f73f
parentb0bc167d55db506e1cd9d79aa767090e93c4be6b (diff)
parentefab76beb0ff9188f5afa04a2242b8f5d68aa1b0 (diff)
downloaderlang-2f3396278bdbebafe18bd5eb81ea46e2d0e63d91.tar.gz
Merge branch 'rickard/apply-reds-fix/OTP-17675' into rickard/apply-reds-fix/master/OTP-17675
* rickard/apply-reds-fix/OTP-17675: HAlloc arguments in apply/fixed_apply instead of GC Swap out/in reduction count on apply and fixed_apply for GC
-rw-r--r--erts/emulator/beam/beam_common.c6
-rw-r--r--erts/emulator/beam/jit/arm/instr_call.cpp13
-rw-r--r--erts/emulator/beam/jit/x86/instr_call.cpp8
3 files changed, 13 insertions, 14 deletions
diff --git a/erts/emulator/beam/beam_common.c b/erts/emulator/beam/beam_common.c
index c9b8dfb51d..0ef3922301 100644
--- a/erts/emulator/beam/beam_common.c
+++ b/erts/emulator/beam/beam_common.c
@@ -1344,11 +1344,7 @@ apply_setup_error_handler(Process* p, Eterm module, Eterm function, Uint arity,
* properly adjusted).
*/
- if (HeapWordsLeft(p) < sz) {
- erts_garbage_collect(p, sz, reg, arity);
- }
- hp = HEAP_TOP(p);
- HEAP_TOP(p) += sz;
+ hp = HAlloc(p, sz);
for (i = arity-1; i >= 0; i--) {
args = CONS(hp, reg[i], args);
hp += 2;
diff --git a/erts/emulator/beam/jit/arm/instr_call.cpp b/erts/emulator/beam/jit/arm/instr_call.cpp
index a141ef5fd1..7679ae18ea 100644
--- a/erts/emulator/beam/jit/arm/instr_call.cpp
+++ b/erts/emulator/beam/jit/arm/instr_call.cpp
@@ -119,7 +119,8 @@ arm::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) {
a.bind(entry);
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs>(3);
+ emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap |
+ Update::eXRegs>(3);
a.mov(ARG1, c_p);
load_x_reg_array(ARG2);
@@ -136,7 +137,8 @@ arm::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) {
runtime_call<4>(apply);
/* Any number of X registers can be live at this point. */
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs>();
+ emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap |
+ Update::eXRegs>();
a.cbnz(ARG1, dispatch);
emit_raise_exception(entry, &apply3_mfa);
@@ -170,8 +172,8 @@ arm::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity,
mov_arg(ARG3, Arity);
- emit_enter_runtime<Update::eStack | Update::eHeap | Update::eXRegs>(
- Arity.getValue() + 2);
+ emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap |
+ Update::eXRegs>(Arity.getValue() + 2);
a.mov(ARG1, c_p);
load_x_reg_array(ARG2);
@@ -188,7 +190,8 @@ arm::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity,
/* We will need to reload all X registers in case there has been
* an error. */
- emit_leave_runtime<Update::eStack | Update::eHeap | Update::eXRegs>();
+ emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap |
+ Update::eXRegs>();
a.cbnz(ARG1, dispatch);
emit_raise_exception(entry, &apply3_mfa);
diff --git a/erts/emulator/beam/jit/x86/instr_call.cpp b/erts/emulator/beam/jit/x86/instr_call.cpp
index 466b184295..968f5bf3de 100644
--- a/erts/emulator/beam/jit/x86/instr_call.cpp
+++ b/erts/emulator/beam/jit/x86/instr_call.cpp
@@ -152,7 +152,7 @@ x86::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) {
align_erlang_cp();
a.bind(entry);
- emit_enter_runtime<Update::eStack | Update::eHeap>();
+ emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
a.mov(ARG1, c_p);
load_x_reg_array(ARG2);
@@ -167,7 +167,7 @@ x86::Mem BeamModuleAssembler::emit_variable_apply(bool includeI) {
runtime_call<4>(apply);
- emit_leave_runtime<Update::eStack | Update::eHeap>();
+ emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
a.test(RET, RET);
a.short_().jne(dispatch);
@@ -203,7 +203,7 @@ x86::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity,
mov_arg(ARG3, Arity);
- emit_enter_runtime<Update::eStack | Update::eHeap>();
+ emit_enter_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
a.mov(ARG1, c_p);
load_x_reg_array(ARG2);
@@ -218,7 +218,7 @@ x86::Mem BeamModuleAssembler::emit_fixed_apply(const ArgVal &Arity,
runtime_call<5>(fixed_apply);
- emit_leave_runtime<Update::eStack | Update::eHeap>();
+ emit_leave_runtime<Update::eReductions | Update::eStack | Update::eHeap>();
a.test(RET, RET);
a.short_().jne(dispatch);