Age | Commit message (Collapse) | Author |
|
* ingela/dtls-cuddling:
dtls: Correct UDP listener cleanup
dtls: Correct return value in UDP listener initialization
|
|
|
|
* ingela/DTLS/retransmission-timers:
dtls: Use repeat_state to make sure retransmission timer is reset
|
|
|
|
* ingela/Jxck/PR-1656/OTP-14843:
remove duplicate operation for decode certificate
|
|
Handle a few more instructions in beam_utils. That will allow
beam_reorder to reorder more instructions, delaying get_tuple_element
instructions and reducing register shuffling in receive clauses.
|
|
v3_codegen: Don't let exit BIFs force a stack frame
|
|
|
|
completely deprecated operation with no effect.
|
|
Remove one of the duplicate word "use"
|
|
* dgud/kernel/refc_sched_wall_time/OTP-11694:
test: spawn scheduler_wall_time flag holder
Turn on scheduler_wall_time in an alive process
Redirect system_flag(scheduler_wall_time,_) to kernel_refc
kernel: add a resource reference counter
|
|
Can not start via rpc any more without spawning a keep alive process,
since it will stop collecting when process dies.
|
|
scheduler_wall_time is ref-counted so it will turn off
if process dies, keep the process that turns it on alive.
|
|
|
|
* maint:
Updated OTP version
Prepare release
mnesia: Fix checkpoint crash
|
|
* maint-20:
Updated OTP version
Prepare release
mnesia: Fix checkpoint crash
|
|
|
|
* ingela/inets/httpc-tests:
inets: Add missing argument in httpc_SUITE
|
|
|
|
* ingela/ssl/engin-ug-doc:
ssl: Add engine use case to Users Guide
|
|
* raimo/stdlib/rand-uniformity:
Tweak statistics limits
Improve check on normal distribution tail
Test normal distribution
|
|
|
|
|
|
* dgud/mnesia/checkpoint-crash/OTP-14841:
mnesia: Fix checkpoint crash
|
|
* dgud/mnesia/slow-startup/OTP-14829:
mnesia: Read schema user properties directly
|
|
Bad timing can cause retain messages to go to a new process if
checkpoint name is reused directly and the checkpoints contain
different tables.
Ignore those messages instead of crash.
|
|
|
|
This is an enhancement of the optimization added in 2e5d6201bb044,
where we tried to avoid forcing a stack frame for functions
that don't really need them.
That optimization would not suppress the stack frame for this
function:
f(A) ->
Res = case A of
a -> x;
b -> y
end,
{ok,Res}.
The reason is that internally the compiler would rewrite
the code to something like this:
f(A) ->
Res = case A of
a -> x;
b -> y;
Other -> error({case_clause,Other})
end,
{ok,Res}.
The call to error/1 would force creation of a stack frame,
even though it is not really needed because error/1 causes
an exception.
Handle calls to exit BIFs specially to allow suppressing the
stack frame.
|
|
* maint:
Updated OTP version
Prepare release
mnesia: Read schema user properties directly
ssh: testcases for space trailing Hello msg
ssh: Don't remove trailing WS in Hello msg
|
|
* maint-19:
Updated OTP version
Prepare release
mnesia: Read schema user properties directly
ssh: testcases for space trailing Hello msg
ssh: Don't remove trailing WS in Hello msg
|
|
Delay creation of stack frames
|
|
|
|
|
|
|
|
|
|
* dgud/mnesia/slow-startup/OTP-14829:
mnesia: Read schema user properties directly
|
|
* dgud/mnesia/backup-error-handling/OTP-14776:
mnesia: Fix error handling in abort write
|
|
* hans/ssh/dont_remove_trailing_ws_19/OTP-14763:
ssh: testcases for space trailing Hello msg
ssh: Don't remove trailing WS in Hello msg
|
|
|
|
* 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.
|
|
|
|
|
|
|