Age | Commit message (Collapse) | Author |
|
Delay creation of stack frames
|
|
* bjorn/compiler/coverage:
beam_utils: Refactor combine_alloc_lists() to cover more lines
map_SUITE: Cover beam_utils:bif_to_test/3
beam_disasm: Remove support for obsolete instructions
guard_SUITE: Test is_bitstring/1 and is_map/1 on literals
|
|
* maint:
Updated OTP version
Prepare release
ssh: Special treatment of OpenSSH clients >= 7.2 rsa-sha2-* public keys
Conflicts:
OTP_VERSION
|
|
* maint-20:
Updated OTP version
Prepare release
ssh: Special treatment of OpenSSH clients >= 7.2 rsa-sha2-* public keys
|
|
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.
|
|
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.
|
|
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.
|
|
To avoid having to call both is_killed/3 and is_not_used/3,
add usage/3 to answer both questions in one call.
|
|
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.
|
|
|
|
|
|
* ingela/inets/http-benchmarks:
inets: Add comparable benchmark tests
inets: Create httpd benchmark framwork
|
|
|
|
|
|
|
|
|
|
maint-20
* hans/ssh/openssh_client_pubkey_sha2/ERL-531/OTP-14827:
ssh: Special treatment of OpenSSH clients >= 7.2 rsa-sha2-* public keys
|
|
Thoose clients signs with sha instead of sha2-*. Try first to verify with the correct one, and if that fails, retry with sha1.
|
|
|
|
* ingela/dtls/fallback-SCSV/OTP-14828:
ssl: Align (with DTLS) and correct TLS_FALLBACK_SCSV handling
|
|
|
|
Add -MMD option to erlc
OTP-14830
|
|
digraph: Document a bad_edge error
|
|
There are four uncovered lines in combine_heap_needs/2 and
combine_alloc_lists/2. There is no way to reach starting from
Erlang source code using the standard compiler. However, they
can be reached starting from BEAM assembly code, so we don't
want to remove them.
We could add a test case that covers the lines using assembly
code, but an easier solution is to rewrite the code in a more
generic way using sofs so that the code can be covered with
existing test cases.
|
|
|
|
=== OTP-20.1.7.1 ===
Changed Applications:
- kernel-5.4.0.1
Unchanged Applications:
- asn1-5.0.3
- common_test-1.15.2
- compiler-7.1.3
- cosEvent-2.2.1
- cosEventDomain-1.2.1
- cosFileTransfer-1.2.1
- cosNotification-1.2.2
- cosProperty-1.2.2
- cosTime-1.2.2
- cosTransactions-1.3.2
- crypto-4.1
- debugger-4.2.3
- dialyzer-3.2.2
- diameter-2.1.2
- edoc-0.9.1
- eldap-1.2.2
- erl_docgen-0.7.1
- erl_interface-3.10
- erts-9.1.5
- et-1.6.1
- eunit-2.3.4
- hipe-3.16.1
- ic-4.4.2
- inets-6.4.4
- jinterface-1.8
- megaco-3.18.2
- mnesia-4.15.1
- observer-2.5
- odbc-2.12
- orber-3.8.3
- os_mon-2.4.3
- otp_mibs-1.1.1
- parsetools-2.1.5
- public_key-1.5.1
- reltool-0.7.5
- runtime_tools-1.12.2
- sasl-3.1
- snmp-5.2.8
- ssh-4.6.2
- ssl-8.2.2
- stdlib-3.4.2
- syntax_tools-2.1.3
- tools-2.11
- wx-1.8.2
- xmerl-1.3.15
Conflicts:
OTP_VERSION
lib/kernel/doc/src/notes.xml
lib/kernel/doc/src/os.xml
lib/kernel/src/os.erl
lib/kernel/vsn.mk
otp_versions.table
|
|
* bjorn/compiler/use-stacktrace-syntax:
Use the new syntax for retrieving stack traces
|
|
Slightly optimize reading of cooked files in list mode
|
|
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.
|
|
|
|
|
|
* lukas/kernel/os_cmd_max_size/OTP-14823:
kernel: Add os:cmd/2 with max_size option
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* lars/ssl/update-runtime-dependencies:
[ssl] Update runtime dependencies
|
|
* maint:
ssh: Update runtime dependencies of ssh
|
|
* hans/ssh/update_runtime_dep:
ssh: Update runtime dependencies of ssh
|
|
Add syntax in try/catch to retrieve the stacktrace directly
|
|
* 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
|
|
|
|
|