Age | Commit message (Collapse) | Author |
|
|
|
De-duplicate bignums in the literal pool
|
|
Eliminate unnecessary 'move' instructions
OTP-14594
|
|
* bjorn/erts/improve-beam-ops:
Optimize dispatch of loop_rec from recv_set
Add missing -no_next directives
Eliminate three arguments for erts_hibernate()
Eliminate three arguments for the apply() helper
Assign machine registers for X86-64
Annotate arithmetic instructions with likely/unlikely
Add annotations for likely/unlikely
ops.tab: Mark infrequently used instructions as %cold
Introduce '%warm' and beam_warm.h
|
|
We KNOW that recv_set instruction is immediately followed
by a loop_rec instruction.
|
|
|
|
We don't need to pass x(0), x(1), and x(2) because they
can already be found in the register array.
|
|
We don't need to pass x(0), x(1), and x(2) because they
can already be found in the register array.
|
|
Keep frequently used variables in machine registers.
|
|
We expect that:
* An arithmetic instruction is more likely to succeed
than to fail.
* An arithmetic instruction is more likely to have small
operands than bignum operands.
|
|
In a correct Erlang programs, we can expect that:
* A GC test instruction (such as test_heap) is more likely
not to do the GC.
* A BIF is more likely to succeed than to fail.
* A BIF is more likely to fail in a guard than in a body.
* An apply or fun call is likely to succeed.
Annotate conditions accordingly.
|
|
Instructions that used to be implemented in beam_emu.c
were not marked as cold as it would make no difference.
|
|
The bit syntax instructions are mixed among other instructions
in beam_hot.h and beam_cold.h.
Introduce a new hotness level called '%warm' with is associated
file beam_warm.h. Mark all bit syntax instructions as '%warm'.
|
|
|
|
Changes confusing example of a bad guard in ets:fun2ms
|
|
* maint:
Upgrade to PCRE 8.41 from PCRE 8.40
|
|
OTP-14574
* rickard/pcre-8.41:
Upgrade to PCRE 8.41 from PCRE 8.40
|
|
The compiler could sometimes emit unnecessary 'move'
instructions in the code for binary matching, for
example for this function:
escape(<<Byte, Rest/bits>>, Pos) when Byte >= 127 ->
escape(Rest, Pos + 1);
escape(<<Byte, Rest/bits>>, Pos) ->
escape(Rest, Pos + Byte);
escape(<<_Rest/bits>>, Pos) ->
Pos.
The generated code would look like this:
{function, escape, 2, 2}.
{label,1}.
{line,[{location,"t.erl",17}]}.
{func_info,{atom,t},{atom,escape},2}.
{label,2}.
{test,bs_start_match2,{f,1},2,[{x,0},0],{x,0}}.
{test,bs_get_integer2,
{f,4},
2,
[{x,0},
{integer,8},
1,
{field_flags,[{anno,[17,{file,"t.erl"}]},unsigned,big]}],
{x,2}}.
{'%',{bin_opt,[17,{file,"t.erl"}]}}.
{move,{x,0},{x,3}}. %% UNECESSARY!
{test,is_ge,{f,3},[{x,2},{integer,127}]}.
{line,[{location,"t.erl",18}]}.
{gc_bif,'+',{f,0},4,[{x,1},{integer,1}],{x,1}}.
{move,{x,3},{x,0}}. %% UNECESSARY!
{call_only,2,{f,2}}.
{label,3}.
{line,[{location,"t.erl",20}]}.
{gc_bif,'+',{f,0},4,[{x,1},{x,2}],{x,1}}.
{move,{x,3},{x,0}}. %% UNECESSARY!
{call_only,2,{f,2}}.
{label,4}.
{move,{x,1},{x,0}}.
return.
The redundant 'move' instructions have been marked.
To avoid the 'move' instructions, we can extend the existing
function is_context_unused/1 in v3_codegen. If v3_codegen can
know that the match context will not be used again, it can reuse
the register for the match context and avoid the extra 'move'
instructions.
https://bugs.erlang.org/browse/ERL-444
|
|
* maint:
Make handling of match contexts stricter
|
|
Make handling of match contexts stricter
OTP-14591
|
|
|
|
* lukas/erts/port_SUITE_dropped_commands_fix:
erts: Fix port_SUITE:dropped_commands tc
|
|
* dszoboszlay/run-dropped_commands-test:
Execute the dropped_commands test case in port_SUITE
|
|
* maint:
Always reply to sync requests
|
|
* dgud/kernel/fix-hanging-io/OTP-14571:
Always reply to sync requests
|
|
Enhance optimisations in beam_peep
|
|
Remove backward compatibility support for float literals
OTP-14575
|
|
beam_validator could fail issue a diagnostic when a register
that was supposed to be a match context was not guaranteed to
be a match context.
The bug was in merging of types. Merging of a match context with
another term would result in a match context. That is wrong. Merging
should produce a more general type, not a narrower type. Also, the
valid slots in two match contexts should be combined with 'band', not
'bor'.
|
|
|
|
|
|
* anders/diameter/config_consistency/OTP-14555:
Let strict_mbit and incoming_maxlen be configured per transport
Let a service configure default transport options
Rename type evaluable -> eval
|
|
* anders/diameter/upgrade/OTP-14552:
Fix compatibility of remote send
|
|
* anders/diameter/strict_capx/OTP-14546:
Document transport_opt() strict_capx
Rename transport_opt() capx_strictness to strict_capx
|
|
* anders/diameter/performance/OTP-14521:
Fix influence of decode_format on service events
Work around more common_test woe
|
|
* anders/diameter/loopback_any/OTP-14544:
Use loopback/any config in examples suite
Handle loopback/any as local address in diameter_tcp/sctp
|
|
* anders/diameter/codec/OTP-14511:
Use map decoding in example client
|
|
* anders/diameter/caseless/OTP-14535:
Replace calls to inet_parse(3)
Fix regexp match of accept tuple in diameter_tcp/sctp
|
|
We start the port in the started process in order
to get the messages in the correct place and also
so that unloading the port driver does not kill the
test process.
|
|
Remove query keyword residues
|
|
Duplicate literals in the literal pool is a waste of memory.
Also, having unique literals can simplify some loader optimizations,
because we can known that if two literal indices are distinct, the
values must be distcint too.
|
|
Otherwise processes doing io could get stuck.
See ERL-472.
|
|
Decoded CER/CEA messages are passed in events messages that can be
subscribed to using diameter:subscribe/1. A configured decode_format was
not reflected in these, messages always being passed as records.
Clarify that strict_arities only applies to message callbacks.
|
|
Conflicts:
erts/emulator/beam/bif.c
erts/emulator/beam/dist.c
erts/emulator/beam/dist.h
erts/emulator/beam/erl_bif_info.c
erts/emulator/beam/erl_node_tables.c
erts/emulator/beam/erl_node_tables.h
erts/emulator/beam/external.c
|
|
|
|
|
|
|
|
|
|
|
|
Starting from R16B, floating point constants are stored
in the literal pool.
The backward compatibility support for the old representation
of floats has been kept long enough. Also, we might want to
ensure that all literals are unique in the future, and we certainly
don't want to update this code to ensure uniqueness.
|
|
* maint:
Remove time-consuming ethread_SUITE from smoke tests
|