summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2021-10-07 12:20:34 +0200
committerRickard Green <rickard@erlang.org>2021-10-07 12:20:34 +0200
commit84c1cc4c2727a4f57b4f137d7eb664168d2a1b02 (patch)
tree3bd60ca57021f2a690a24de7566ff25b559fe8e7
parente8d30d1a87db03144fa6f7c76b84d2928b6737b6 (diff)
parentefab76beb0ff9188f5afa04a2242b8f5d68aa1b0 (diff)
downloaderlang-84c1cc4c2727a4f57b4f137d7eb664168d2a1b02.tar.gz
Merge branch 'rickard/apply-reds-fix/OTP-17675' into maint
* 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/x86/instr_call.cpp8
2 files changed, 5 insertions, 9 deletions
diff --git a/erts/emulator/beam/beam_common.c b/erts/emulator/beam/beam_common.c
index 5eeb9a9807..1a1326450f 100644
--- a/erts/emulator/beam/beam_common.c
+++ b/erts/emulator/beam/beam_common.c
@@ -1300,11 +1300,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/x86/instr_call.cpp b/erts/emulator/beam/jit/x86/instr_call.cpp
index b79ef5567c..e0ee3543bd 100644
--- a/erts/emulator/beam/jit/x86/instr_call.cpp
+++ b/erts/emulator/beam/jit/x86/instr_call.cpp
@@ -136,7 +136,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);
@@ -151,7 +151,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);
@@ -185,7 +185,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);
@@ -200,7 +200,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);