aboutsummaryrefslogtreecommitdiffstats
path: root/lib
AgeCommit message (Collapse)Author
2017-12-15v3_codegen: Delay creation of stack framesBjörn Gustavsson
v3_codegen currently wraps a stack frame around each clause in a function (unless the clause is simple without any 'case' or other complex constructions). Consider this function: f({a,X}) -> A = abs(X), case A of 0 -> {result,"0"}; _ -> {result,integer_to_list(A)} end; f(_) -> error. The first clause needs a stack frame because there is a function call to integer_to_list/1 not in the tail position. v3_codegen currently wraps the entire first clause in stack frame. We can delay the creation of the stack frame, and create a stack frame in each arm of the 'case' (if needed): f({a,X}) -> A = abs(X), case A of 0 -> %% Don't create a stack frame here. {result,"0"}; _ -> %% Create a stack frame here. {result,integer_to_list(A)} end; f(_) -> error. There are pros and cons of this approach. The cons are that the code size may increase if there are many 'case' clauses and each needs its own stack frame. The allocation instructions may also interfere with other optimizations, but the new optimizations introduced in previous commits will mitigate most of those issues. The pros are the following: * For some clauses in a 'case', there is no need to create any stack frame at all. * Often when moving an allocation instruction into a 'case' clause, the slightly cheaper 'allocate' instruction can be used instead of 'allocate_zero'. There is also the possibility that the allocate instruction can be be combined with a 'test_heap' instruction. * Each stack frame for each arm of the 'case' will have exactly as many slots as needed.
2017-12-15beam_record: Try harder to avoid fetching the tag elementBjörn Gustavsson
When rewriting tuple matching of the first element of a tuple to an is_tagged_tuple instruction, the get_tuple_element instruction that fetches the tag will be left unless the register that is fetched is subsequently killed. We can do better than that. If the register is referenced in an allocating instruction, but its value is never actually used, we can do one of two things: if the value is known to be defined earlier (using annotations added by beam_utils:anno_defs/1) the instruction can be removed altogether; if not, it can be replaced with a 'move nil TagRegister' instruction.
2017-12-15beam_block: Improve moving of allocationsBjörn Gustavsson
Use annotations added by beam_utils:anno_defs/1 to move more allocations upwards in the instruction stream. That in turn allows us to optimize away more 'move' instructions.
2017-12-15beam_utils: Add usage/3Björn Gustavsson
To avoid having to call both is_killed/3 and is_not_used/3, add usage/3 to answer both questions in one call.
2017-12-15beam_utils: Add anno_defs/1Björn Gustavsson
Add beam_utils:anno_defs/1 which will add an annotation to the beginning of each block indicating which X registers that are defined. Having that information can improve some optimizations.
2017-12-15beam_utils: Improve precision for is_not_used/3Björn Gustavsson
2017-12-13beam_util: Fix bug in is_not_used/3Björn Gustavsson
01835845579e9 fixed some problems, but introduced a bug where is_not_used/3 would report that a register was not used when it in fact was.
2017-12-09v3_codegen: Eliminate unused function argumentsBjörn Gustavsson
758712d6294 changed the need_heap/2 function so that it stopped using its second argument. Remove the second argument from need_heap(), and update all callers to similarly remove unused arguments.
2017-12-08Merge branch 'maint'Hans Nilsson
* maint: ssh: Update runtime dependencies of ssh
2017-12-08Merge pull request #1634 from bjorng/bjorn/get_stacktrace-syntax/OTP-14692Björn Gustavsson
Add syntax in try/catch to retrieve the stacktrace directly
2017-12-08Merge branch 'bjorn/compiler/cover-v3_codegen'Björn Gustavsson
* bjorn/compiler/cover-v3_codegen: v3_codegen: Simplify #k_guard_break{} v3_codegen: Remove uncovered clause in bs_rename_ctx/4 Cover handling of #k_call{} in v3_codegen:bsm_rename_ctx/4 v3_codegen: Move guard_cg_list/6 to a more logical place v3_codegen: Remove unnecessary clause for handling #cg_block{} v3_codegen: Remove unnecessary adding of variable to set
2017-12-08ssh: Update runtime dependencies of sshHans Nilsson
2017-12-07Merge branch 'hasse/stdlib/base64/OTP-14624'Hans Bolinder
* hasse/stdlib/base64/OTP-14624: stdlib: Add base64 benchmarks stdlib: Do not check base64 input more than needed stdlib: Minor optimization of base64 stdlib: Use binary_to_list in base64 when it is faster stdlib: Optimize base64 functions
2017-12-07Merge branch 'maint'Anders Svensson
2017-12-07Merge branch 'anders/diameter/typo/OTP-14805' into maintAnders Svensson
* anders/diameter/typo/OTP-14805: vsn -> 2.1.3 Update appup for 20.2 Fix doc typo
2017-12-07v3_codegen: Simplify #k_guard_break{}Björn Gustavsson
It turns out that we don't need to keep track of locked variables, because the locked variables are always the same variables that will be alive after a #k_guard_break{}.
2017-12-07v3_codegen: Remove uncovered clause in bs_rename_ctx/4Björn Gustavsson
Remove handling of #k_match{} in bsm_rename_ctx/4. It can never be reached because bsm_rename_ctx/4 will never recurse into a block that is not in the scope of a #k_protected{}, and in a #k_protected{}, #k_match{} is not allowed.
2017-12-07Cover handling of #k_call{} in v3_codegen:bsm_rename_ctx/4Björn Gustavsson
2017-12-07v3_codegen: Move guard_cg_list/6 to a more logical placeBjörn Gustavsson
Put guard_cg_list/6 directly after guard_cg/5.
2017-12-07v3_codegen: Remove unnecessary clause for handling #cg_block{}Björn Gustavsson
The function guard_cg/5 handles constructs found within the records #k_guard_clause{] and #k_protected{}. Since #k_guard_clause{} can only contain a #k_protected{}, and #k_protected{} in turn cannot contain a #cg_block{}, the clause for handling #cg_block{} in guard_cg/5 is never executed and can be removed.
2017-12-07v3_codegen: Remove unnecessary adding of variable to setBjörn Gustavsson
The variable being added will already be there (added by v3_kernel).
2017-12-07Merge pull request #1652 from ↵Björn Gustavsson
bjorng/bjorn/compiler/fix-excessive-allocations/ERL-514 Avoid excessive stack frame allocation OTP-14808
2017-12-06Add a test case for ERL-514Björn Gustavsson
2017-12-06beam_dead: Improve creation of select_val from is_eq_exactBjörn Gustavsson
When converting a comparison BIF (such as '=:=') to a test instruction, run the other optimizations on the result. When trying to combine is_eq_exact tests, handle the case that is_eq_exact is followed by a jump instead of a label to handle a test that has been newly converted from a BIF. Taken together, those changes will coalesce more is_eq_exact instructions into select_val instructions.
2017-12-06v3_codegen: Avoid excessive stack frame allocationBjörn Gustavsson
A 'case' or 'if' that does not occur last in a function clause will always force a stack frame. The reasoning behind this is that in most uses of 'case' there will be a function call from within the 'case'. When there is a function call, the stack frame is needed both to save the continuation pointer and to save any X registers that will need to survive the call. When there is no function call from a 'case', the resulting stack frame is annoying. There will be register shuffling, and the existence of the stack frame may thwart many optimizations (for example, in beam_dead). Therefore, add an extra pass to v3_codegen to avoid creating a stack frame when not needed. https://bugs.erlang.org/browse/ERL-514
2017-12-05Merge branch 'maint'Ingela Anderton Andin
Conflicts: lib/ssl/src/ssl_cipher.erl lib/ssl/src/ssl_handshake.erl
2017-12-05Merge branch 'ingela/ssl/cipher-suites/OTP-14749' into maintIngela Anderton Andin
* ingela/ssl/cipher-suites/OTP-14749: ssl: Use maps for cipher suites internally
2017-12-05ssl: Use maps for cipher suites internallyIngela Anderton Andin
This is a preparation for improvements to come in option handling and support for TLS-1.3
2017-12-04Merge branch 'maint'Peter Andersson
2017-12-04Merge branch 'peppe/common_test/auto_cleanup/OTP-13832' into maintPeter Andersson
* peppe/common_test/auto_cleanup/OTP-13832: Add tests and doc for the new remaining_test_procs function Implement function that finds disposable test processes Tag Common Test system processes using process dictionary Add app name tag in process dictionary OTP-13832
2017-12-04Add tests and doc for the new remaining_test_procs functionPeter Andersson
2017-12-04Merge branch 'raimo/ssl-dist-bench/OTP-14657'Raimo Niskanen
* origin/raimo/ssl-dist-bench/OTP-14657: Write SSL distribution benchmarks Polish SSL distribution Handle whitebox test message Correct distribution doc Use SNI when connecting Use -ssl_dist_optfile options Read in -ssl_dist_optfile to ETS Facilitate test certs with common root Stop checking DNS name for SNI
2017-12-04Merge branch 'raimo/ssl-dist-optfile-backport/OTP-14657' into maintRaimo Niskanen
* raimo/ssl-dist-optfile-backport/OTP-14657: Use SNI when connecting Use -ssl_dist_optfile options Read in -ssl_dist_optfile to ETS Facilitate test certs with common root Stop checking DNS name for SNI
2017-12-04Merge branch 'maint'Peter Andersson
2017-12-04Merge branch 'peppe/common_test/index_last_test/OTP-14281' into maintPeter Andersson
* peppe/common_test/index_last_test/OTP-14281: Show links to latest test run by using an html redirection file OTP-14281
2017-12-04Show links to latest test run by using an html redirection filePeter Andersson
2017-12-04Write SSL distribution benchmarksRaimo Niskanen
2017-12-04Use SNI when connectingRaimo Niskanen
2017-12-04Use -ssl_dist_optfile optionsRaimo Niskanen
2017-12-04Read in -ssl_dist_optfile to ETSRaimo Niskanen
2017-12-04Facilitate test certs with common rootRaimo Niskanen
2017-12-04Stop checking DNS name for SNIRaimo Niskanen
2017-12-04Merge branch 'maint'Lars Thorsen
2017-12-04[crypto] Add engine_ctrl_cmd_string() to APILars Thorsen
2017-12-04Polish SSL distributionRaimo Niskanen
2017-12-04Handle whitebox test messageRaimo Niskanen
2017-12-04Correct distribution docRaimo Niskanen
2017-12-04Use SNI when connectingRaimo Niskanen
2017-12-04Use -ssl_dist_optfile optionsRaimo Niskanen
2017-12-04Read in -ssl_dist_optfile to ETSRaimo Niskanen