aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2019-08-22Optimize the move_call instructionsBjörn Gustavsson
The `move_call` instructions are combinations of a `move` instruction and a `call` instruction. As currently implemented, the `move` part of the instruction is executed in its entirety before the `call` part is even started. The reason is that the C compiler cannot see that it would be safe to read the target address of the call before writing to the move destination. Rewrite the instructions to explicitly read both the source for the move and the target address for the call before writing the destination of the move. Micro-benchmarks show a small but consistent speed-up after this change.
2019-08-22Optimize deallocate_return instructionsBjörn Gustavsson
Eliminating the CP register and putting continuation pointers directly on the stack made the deallocate_return instruction slower. Try to mitigate this slow down by specializing deallocate_return for small stack. For the move_deallocate_return instruction, reorder instructions to make it possible to execute the read instructions in parallel.
2019-08-22Optimize continuation pointer managementBjörn Gustavsson
The BEAM instructions for calling a function don't save the continuation pointer (return address) on the stack, but to a special BEAM register called CP. It is the responsibility of the called function to save CP to the stack frame before calling other functions. In the earlier implementations of BEAM on Sparc, CP was located in a CPU register. That meant that the continuation pointer was never written to memory when calling simple functions that didn't call other functions at all or ended in a tail-call to another function. The modern BEAM no longer keeps CP in CPU register. Instead, it is kept in the `process` struct (in `p->cp`). That means the continuation pointer must be written to the memory on every call, and if the called function will call other functions, it will must read the continuation pointer from `p->cp` and store it on the stack. This commit eliminates the concept of the CP register and modifies the call instructions to directly store the continuation pointer on the stack. That makes allocation and trimming of stack frames slightly faster. A more important benefit is simplification of code that handles continuation pointers. Because all continuation pointers are now stored on the stack, the special case of handling `p->cp` disappears. Co-authored-by: John Högberg <[email protected]>
2019-08-14Merge branch 'maint'Björn Gustavsson
* maint: Fix compiler crash when compiling some receive statements
2019-08-14Merge pull request #2347 from ↵Björn Gustavsson
bjorng/bjorn/compiler/fix-receive-bug/ERL-1022/OTP-15982 Fix compiler crash when compiling some receive statements
2019-08-14Fix compiler crash when compiling some receive statementsBjörn Gustavsson
The compiler would crash when compiling the following code: do(Acc) -> receive {Pid, abc} -> ok; {Pid, []} -> ok; {Pid, _Res} -> exit(_Res) end, do([Pid | Acc]). The last clause that always raises an exception would confuse the compiler so that it would think that the `receive` statement was at the end of the function and it would generate incorrect code for the `do/1` call following the `receive`. https://bugs.erlang.org/browse/ERL-1022
2019-08-13Merge branch 'maint'John Högberg
* maint: erts: Fix crash in instrument:allocations/0-1
2019-08-13Merge branch 'john/erts/fix-instrument-allocations-race/OTP-15983' into maintJohn Högberg
* john/erts/fix-instrument-allocations-race/OTP-15983: erts: Fix crash in instrument:allocations/0-1
2019-08-12Merge branch 'maint'John Högberg
* maint: erts: Create heap binaries in binary:split/2-3 erts: Create heap binaries in binary_part/2-3 erts: Create heap binaries in split_binary/2 erts: Create heap binaries in bs_get_binary2 erts: Remove size check in bs_start_match erts: Disallow binaries whose size in bits exceeds UWORD_MAX
2019-08-12Merge branch 'john/erts/bs_get_binary2-heap-binaries/OTP-15977' into maintJohn Högberg
* john/erts/bs_get_binary2-heap-binaries/OTP-15977: erts: Create heap binaries in binary:split/2-3 erts: Create heap binaries in binary_part/2-3 erts: Create heap binaries in split_binary/2 erts: Create heap binaries in bs_get_binary2 erts: Remove size check in bs_start_match erts: Disallow binaries whose size in bits exceeds UWORD_MAX
2019-08-12Merge branch 'maint'John Högberg
* maint: Fix documentation for erlang:is_map_key/2
2019-08-12erts: Fix crash in instrument:allocations/0-1John Högberg
The current carrier list was read when the allocator wasn't locked, crashing the emulator if a block scan raced with a carrier allocation.
2019-08-12Merge pull request #2325 from max-au/is_map_key_doc_fixBjörn Gustavsson
Fix documentation for erlang:is_map_key/2
2019-08-09Merge branch 'maint'Dan Gudmundsson
* maint: Correct dump_log_write_threshold default value
2019-08-09Merge pull request #2332 from the-mikedavis/patch-1Dan Gudmundsson
Correct documentation on dump_log_write_threshold default value
2019-08-09Merge branch 'maint'Dan Gudmundsson
* maint: Handle clicking links more than once in Observer's "Expanded term"
2019-08-09Merge remote-tracking branch 'upstream/pr/2201' into maintDan Gudmundsson
* upstream/pr/2201: Handle clicking links more than once in Observer's "Expanded term" OTP-15980
2019-08-09erts: Create heap binaries in binary:split/2-3John Högberg
2019-08-09erts: Create heap binaries in binary_part/2-3John Högberg
2019-08-09erts: Create heap binaries in split_binary/2John Högberg
2019-08-09erts: Create heap binaries in bs_get_binary2John Högberg
ErlSubBin is a large struct that often dwarfs the region of memory it points at, and it's common for them to refer to a ProcBin which must be kept around as long as the SubBin lives, using up even more heap space and keeping the referenced binary alive regardless of how small the sub-binary is.
2019-08-09erts: Remove size check in bs_start_matchJohn Högberg
The size check is redundant now that all binaries are guaranteed to be small enough that their size in bits fits into a word.
2019-08-09erts: Disallow binaries whose size in bits exceeds UWORD_MAXJohn Högberg
These have never worked in binary matching (including sub-binaries extracted from them) so it's hard to justify their existence. They also make a future migration of binary sizes from bytes to bits problematic, so we may as well change it ahead of time. This is potentially incompatible on 32-bit platforms where a NIF or driver could allocate 512MB+ binaries, but allocations that large should be expected to fail anyway.
2019-08-09Merge branch 'maint'Dan Gudmundsson
* maint: mnesia: Bump protocol version mnesia: Introduce sync_asym_trans protocol observer: Fixes for html viewers observer: Support darkmode gui
2019-08-09Merge branch 'dgud/observer/fix-darkmode/OTP-15916' into maintDan Gudmundsson
* dgud/observer/fix-darkmode/OTP-15916: observer: Fixes for html viewers observer: Support darkmode gui
2019-08-09Merge branch 'dgud/mnesia/sticky-bug/ERL-768/OTP-15979' into maintDan Gudmundsson
* dgud/mnesia/sticky-bug/ERL-768/OTP-15979: mnesia: Bump protocol version mnesia: Introduce sync_asym_trans protocol
2019-08-09Merge branch 'maint'Dan Gudmundsson
* maint: mnesia: Fix deadlock caused by add_table_copy
2019-08-09Merge branch 'dgud/mnesia/add_table_copy_deadlock/ERL-872/OTP-15933' into maintDan Gudmundsson
* dgud/mnesia/add_table_copy_deadlock/ERL-872/OTP-15933: mnesia: Fix deadlock caused by add_table_copy
2019-08-09Update primary bootstrapBjörn Gustavsson
2019-08-09Merge branch 'maint'Björn Gustavsson
* maint: Update primary bootstrap
2019-08-09Update primary bootstrapBjörn Gustavsson
2019-08-08Merge branch 'maint'John Högberg
* maint: erts: Escape atoms in erlang:fun_to_list/1
2019-08-08Merge branch 'john/erts/fun_to_list-escaping/OTP-15975/ERL-1009' into maintJohn Högberg
* john/erts/fun_to_list-escaping/OTP-15975/ERL-1009: erts: Escape atoms in erlang:fun_to_list/1
2019-08-08Merge branch 'john/compiler/fix-bs_skip-succeeded-oddity'John Högberg
* john/compiler/fix-bs_skip-succeeded-oddity: compiler: Fix awkward match context substitution beam_ssa_lint: Use #b_var{} instead of variable names
2019-08-08Merge branch 'john/compiler/remove-dead-code-beam_ssa_type'John Högberg
* john/compiler/remove-dead-code-beam_ssa_type: beam_ssa_type: Remove unreachable code
2019-08-07Merge pull request #2226 from josevalim/jv-expand-squeeze-literal-integer-utf8John Högberg
Expand and squeeze literal integers/utf8 bin segments
2019-08-07compiler: Fix awkward match context substitutionJohn Högberg
This worked out by accident since codegen never actually looks at the arguments for 'succeeded'; it just assumes that they reference the preceding instruction.
2019-08-07beam_ssa_lint: Use #b_var{} instead of variable namesJohn Högberg
2019-08-07Merge branch 'maint'Dan Gudmundsson
* maint: Discard continuous delivery history
2019-08-07Discard continuous delivery historyDan Gudmundsson
Repository grows too large.
2019-08-07Merge branch 'maint'Dan Gudmundsson
* maint: Update java doc Print last lines of configure log Force xenial builds in travis
2019-08-07Update java docDan Gudmundsson
Replace deprecated <tt> with <code>
2019-08-07Print last lines of configure logDan Gudmundsson
So we can see in travis which applications or options that is disabled, (and/or other config problems)
2019-08-07Force xenial builds in travisDan Gudmundsson
So we know that libwxgtk3.0 exists.
2019-08-07beam_ssa_type: Remove unreachable codeJohn Högberg
Now that impossible branches are skipped altogether, it's no longer possible to encounter get_tuple_element with a 'none' argument.
2019-08-07Merge branch 'maint'Lukas Larsson
2019-08-07Merge branch 'lukas/os_mon/sscanf_Lu/OTP-15974' into maintLukas Larsson
* lukas/os_mon/sscanf_Lu/OTP-15974: os_mon: Fix sscanf to use %llu instead of gnu specific %Lu
2019-08-07erts: Escape atoms in erlang:fun_to_list/1John Högberg
2019-08-07Merge branch 'john/compiler/validator-improve-try_case-handling'John Högberg
* john/compiler/validator-improve-try_case-handling: beam_validator: Disallow jumps to try_case handlers
2019-08-07Merge branch 'john/compiler/explicit-call-exceptions'John Högberg
* john/compiler/explicit-call-exceptions: compiler: Simplify set_tuple_element optimization compiler: Make 'succeeded' optimization more general compiler: Simplify call type optimization compiler: All calls may throw, so they all need success checks erts_debug: Turn off unsafe optimizations in test case