aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam
AgeCommit message (Collapse)Author
2019-03-06Eliminate unused i_bs_skip_bits_all2 instructionBjörn Gustavsson
Starting in OTP 19 (in commit 9504c0dd71d0), the compiler emits a test_unit instruction instead of a skip instruction at the end of binary. We can do the same replacement in the loader to get rid of the i_bs_skip_bits_all2 instruction.
2019-03-06Optimize field size calculation on a 64-bit architectureBjörn Gustavsson
On a 64-bit architecture, the size of any binary that would fit in the memory must fit in a small, so we can fail immediately if the size term is not a small.
2019-03-06Reduce code size for binary matching instructionsBjörn Gustavsson
The new compiler required adding support for Y register for all binary matching instructions. That was (intentionally) done in a naive way that simplicated duplicated the entire body of each instruction. Now it's time to be less naive. Rewrite the binary matching instructions using micro instructions. Because some of the binary instructions are huge, that will significantly decrease the size of process_main(). When compiling with clang, a huge process_main() would mess up profile-guide optimization resulting in a significant performance degradation. On my Mac, profile-guide optimzation would decrease the estone benchmark by 100K estones (about 20 percent). This commit gives me back the lost estones.
2019-03-06Deoptimize obsoleted binary matching instructionsBjörn Gustavsson
Mark the obsoleted instructions bs_start_match2, bs_save2, bs_restore2, and bs_context_to_binary as cold. Remove support of a Y operand for bs_save2 and bs_restore2.
2019-03-06Reclassify get_tuple_element with a Y destination as hotBjörn Gustavsson
get_tuple_element with an Y register has become more frequent with the new compiler.
2019-03-06Remove optimization that has become a pessimizationBjörn Gustavsson
The compiler used to generate "move Literal y(Y)" instructions very rarely. Therefore, there was a transformation to avoid having a "move c y" instruction. With the new compiler, "move Literal y(Y)" instructions are relatively frequent, so we will need a "move c y" instruction.
2019-03-06Introduce move_window2 and remove move2_par_xyxyBjörn Gustavsson
2019-03-06Optimize hd/1 and tl/1 in guardsBjörn Gustavsson
2019-03-06bif_instrs.tab: Don't hardcode length of instructionsBjörn Gustavsson
2019-03-06beam_emu.c: Rename the confusing macro GetR() to GetSource()Björn Gustavsson
2019-03-04Merge branch 'maint'Siri Hansen
2019-03-04Merge branch 'siri/logger/os-timestamp/OTP-15625' into maintSiri Hansen
* siri/logger/os-timestamp/OTP-15625: Update preloaded [logger] Change timestamp from erlang:system_time to os:system_time
2019-03-01Combine is_nonempty_list with get_hd/get_tlBjörn Gustavsson
The is_nonempty_list test is very frequently followed by get_tl, and frequently followed by get_hd.
2019-03-01Remove the combined instruction is_nonempty_list_test_heapBjörn Gustavsson
It turns out that the combination of is_nonempty_list and test_heap is no longer frequent.
2019-03-01Combine more init instructionsBjörn Gustavsson
2019-03-01Combine test_arity with get_tuple_elementBjörn Gustavsson
The test_arity instruction is often followed by get_tuple_element.
2019-03-01Combine get_tuple_element when destinations are not consecutiveBjörn Gustavsson
2019-02-28Remove rarely used swap instructionsBjörn Gustavsson
`swap x y` is rarely or never used. I found a single use of `swap_temp x y x` in the sample of modules compiled by `scripts/diffable`.
2019-02-28Tune move instructionsBjörn Gustavsson
Of the `move_dup` instructions, only `move_dup x x x` was frequently used. Remove the other register combinations. With those instruction `move_dup` instructions removed, it is necessary to add new predicates to avoid unsafe translation to `move_shift` and `move2_par`. Also add additional transformations to transform more `move` instructions into `move2_par`. The existing transformation would require the `move` instructions to be in the "right" order in order to be transformed. Remove `move3 x y x y x y` because it turns out to be rarely executed.
2019-02-27Revert "Prepare release"Rickard Green
This reverts commit df130102cdeca8d35fec95a0c926fd1cfec54eab.
2019-02-26Prepare releaseErlang/OTP
2019-02-25Merge pull request #2124 from kjellwinblad/kjell/stdlib/iolist_size_trapKjell Winblad
Make iolist_size/1 yield OTP-15631
2019-02-25Make iolist_size/1 yieldKjell Winblad
The iolist_size/1 function did not yield even if the input list was very long and a call to the function did only consume a single reduction. This commit fixes these problems.
2019-02-23Merge branch 'maint'Rickard Green
* maint: erts: Fix macro redefinition
2019-02-22erts: Fix macro redefinitionBjörn-Egil Dahlberg
LIST_NEXT and LIST_PREV causes macro redefinitions from other include files. beam/erl_ao_firstfit_alloc.c:103:9: warning: 'LIST_NEXT' macro redefined [-Wmacro-redefined] ^ /usr/include/sys/queue.h:507:9: note: previous definition is here ^ 1 warning generated. beam/erl_bestfit_alloc.c:125:9: warning: 'LIST_NEXT' macro redefined [-Wmacro-redefined] ^ /usr/include/sys/queue.h:507:9: note: previous definition is here ^
2019-02-22[logger] Change timestamp from erlang:system_time to os:system_timeSiri Hansen
This is to align the timestamps with external logs.
2019-02-22Merge PR-2147 from sverker/sverker/enif-null-pid/OTP-15011Sverker Eriksson
Add enif_set_pid_undefined & enif_is_pid_undefined
2019-02-22Merge branch ↵Lukas Larsson
'lukas/erts/fragment-dist-messages/OTP-13397/OTP-15610/OTP-15611/OTP-15612/OTP-15613' * lukas/erts/fragment-dist-messages/OTP-13397/OTP-15610/OTP-15611/OTP-15612/OTP-15613: erts: Add debug dist obuf memory leak check win32: Fix ./otp_build debuginfo_win32 Make ld.sh on windows print better error reason erts: Fix so that externals with creation 0 compare equal to all erts: Expand etp to look for free processes erts: Implement trapping while sending distr exit/down erts: Add ERL_NODE_BOOKKEEP to node tables refc erts: Refactor ErtsSendContext to be ErtsDSigSendContext erts: Add distr testcases for fragmentation erts: Make remote send of exit/2 trap erts: Implement fragmentation of distrubution messages erts: Expand distribution protocol documentation erts: Move reason in dist messages to payload erts: Remove a copy of distribution data payload erts: Yield later during process exit and allow free procs to run erts: Refactor rbt _yielding to use reductions erts: Limit binary printout for %.XT in erts_print
2019-02-22erts: Add debug dist obuf memory leak checkLukas Larsson
2019-02-22erts: Fix so that externals with creation 0 compare equal to allLukas Larsson
The special creation of 0 is used by internally created externals, such as when list_to_pid is called. This creation should compare equal to all externals creations of that external. If it does not we can end up in very strange scenarios. For instance: > P = spawn(OtherNode, fun() -> die end). <8303.60.0> > link(<8303.60.0>). true > flush(). ok OTP-15613
2019-02-22erts: Implement trapping while sending distr exit/downLukas Larsson
The reason in EXIT and DOWN may be arbitrarily large, so we yield and allow other processes to execute while encoding and sending the signals over the distribution.
2019-02-22erts: Add ERL_NODE_BOOKKEEP to node tables refcLukas Larsson
2019-02-22erts: Refactor ErtsSendContext to be ErtsDSigSendContextLukas Larsson
This commit removed the general send context (which was used very little anyways) and only uses the distributed send context. This will make it easier to use the dist API at the cost of a little bit more code for the local send.
2019-02-22erts: Make remote send of exit/2 trapLukas Larsson
OTP-15612
2019-02-22erts: Implement fragmentation of distrubution messagesLukas Larsson
2019-02-21erts: Move reason in dist messages to payloadLukas Larsson
The dist messages EXIT, EXIT2 and MONITOR_DOWN have been updated with new versions that send the reason term as part of the payload of the message instead of as part of the control message. This allows the decode of the reason to be done by the receiving process instead of the dist entry which in turn makes it possible for multiple decodes to be done in parallel. This change is done in order to make it easier to fragment the potentially large payload of EXIT, EXIT2 and MONITOR_DOWN into multiple distribution messages. OTP-15611
2019-02-21erts: Remove a copy of distribution data payloadLukas Larsson
Before this change the inet driver was in list mode and thus the data from it had to be copied when received by the dist entry. This change puts the tcp port in binary mode and makes the any refc binary created by it be used all the way to the process where it is decoded. Thus eliminating one copy of the entire message payload.
2019-02-21erts: Yield later during process exit and allow free procs to runLukas Larsson
OTP-15610
2019-02-20Merge branch 'maint'Sverker Eriksson
2019-02-20Merge branch 'sverker/erts/term_to_binary-reductions/ERL-774/OTP-15514' into ↵Sverker Eriksson
maint * sverker/erts/term_to_binary-reductions/ERL-774/OTP-15514: erts: Consume reductions for strings in term_to_binary erts: Reduce number of list traversals in term_to_binary
2019-02-20erts: Consume reductions for strings in term_to_binarySverker Eriksson
Cost per string byte, but we still don't yield mid-string.
2019-02-20Merge branch 'maint'Sverker Eriksson
2019-02-20Merge branch 'sverker/enif_consume_timeslice-dirty-nop/OTP-15604' into maintSverker Eriksson
* sverker/enif_consume_timeslice-dirty-nop/OTP-15604: erts: Make enif_consume_timeslice no-op on dirty sched
2019-02-20erts: Add enif_compare_pidsSverker Eriksson
as a macro wrappper around enif_compare
2019-02-20erts: Add enif_set_pid_undefined & enif_is_pid_undefinedSverker Eriksson
2019-02-19Merge branch 'maint'Sverker Eriksson
2019-02-19Merge branch 'sverker/heart-nice-exit/OTP-15599' into maintSverker Eriksson
* sverker/heart-nice-exit/OTP-15599: erts: Avoid heart killing a nicely exiting emulator
2019-02-18erts: Make enif_consume_timeslice no-op on dirty schedSverker Eriksson
2019-02-15erts: Reduce number of list traversals in term_to_binarySverker Eriksson
by patching list length when we reach end of list. And remove unnecessary traversals in is_string and is_external_string beyond the max length for STRING_EXT.
2019-02-15Merge pull request #2142 from ↵Björn Gustavsson
bjorng/bjorn/erts/revert-optional-tuple-calls/OTP-15581 Remove support for optional tuple calls