Age | Commit message (Collapse) | Author |
|
|
|
get_ianno/1 would retrieve either a bare annotation or an
annotation wrapped in an #a{} record. In both cases, it would
return a wrapped annotation.
We can replace the calls to get_ianno/1 with calls to get_anno/1,
because the argument is always an #iclause{} and all iclause records
are always initialized with a wrapped annotation.
|
|
If we have a sequence of put_map_* instructions operating on the
same map, it will be more efficient if we can have one is_map/2
instruction before put_map_* instructions, so that each put_map_*
does not need to test whether the argument is a map.
|
|
When calculating the number of live registers for allocation
instruction, it is not always safe to start with the number of live
registers at the start of the block. We will need to use the register
map to know whether there are any holes (dead registers) that are not
subsequently filled.
If the allocation instruction already has a number of live registers
calculated, there is nothing to be gained by raising it.
|
|
As a preparation for fixing a bug, introduce a complete register
map in the '%live' annotations.
|
|
|
|
|
|
* bjorn/cover:
test_server: Sort cover-analysed modules
cover: Optimize file operations
|
|
* maint:
Ensure dbg tracer exits when dbg is stopped
|
|
* fishcakez/runtime_tools/dbg/OTP-12517:
Ensure dbg tracer exits when dbg is stopped
|
|
|
|
* peppe/common_test/missing_start_flag_in_doc:
Add missing -group flag in ct_run help text
OTP-12433
|
|
Previously the tracer might receive an 'EXIT' message in the trace
receive loop and treat it as garbage.
Test uses a custom dbg process handler to reliably recreate the
race condition, i.e. the message order {trace, ..}, {'EXIT, ..}.
|
|
* sverk/crypto-aes_ecb_crypt-dialyzer-fix:
crypto: Fix dialyzer error for aes_ecb_crypt/3
|
|
'cover' has changed so that the analyzed results are returned in
random order, which is annyoying. Sort the list so that modules
appear in alphabetical order.
|
|
Use the 'raw', 'delayed_write', and 'read_head' options to speed up file
operations. The analysis at the end of:
ts:run(compiler, [batch,cover]).
is now roughly twice as fast.
|
|
|
|
* nox/stdlib/erl_lint-maps/OTP-12515:
Properly lint map expressions in erl_lint
|
|
* nox/stdlib/erl_lint-expr_list:
Remove a few superfluous vt operations in erl_lint
|
|
|
|
* zandra/xcomp-power-pc-dso-linux-fix:
update ppc xcomp file
|
|
|
|
* nifoc/inet_doc_fixes:
Fix typos ("received to the socket")
|
|
* richcarl/syntax_tools-remove-mnemosyne:
Remove Mnemosyne rules support from EDoc
Remove support for Mnemosyne rules
Remove support for mnemosyne-style record field access
OTP-12511
|
|
|
|
* mikpe/remove-perfctr-support:
remove perfctr support
OTP-12508
|
|
|
|
'origin/peppe/common_test/include_file_problems' into maint
* origin/peppe/common_test/include_file_problems:
Fix failing test case
Add valid include path to epp in erl2html2 and fix crashing code
OTP-12419
|
|
|
|
* bjorn/compiler/beam_jump-share:
beam_jump: Don't jump into the middle of a 'try'
|
|
* bjorn/compiler/sys_core_fold:
sys_core_fold: Fix non-tail-recursive list comprehensions
|
|
* josevalim/stdlib/dict:
Short-circuit common dict operations
|
|
Given any Vt1 and Vt2 values, vtmerge(vtnew(Vt1, Vt2), vtold(Vt1, Vt2)) is always
equal to Vt1.
|
|
* siri/cover-perf/OTP-12330:
[test_server] Use new, more efficient functions in cover
[cover] Improve performance
|
|
|
|
Add functions for cover compilation and analysis on multiple
files. This allows for more parallelisation.
All functions for cover compilation can now take a list of
modules/files.
cover:analyse/analyze and cover:analyse_to_file/analyze_to_file can be
called without the Modules arguement in order to analyse all cover
compiled and imported modules, or with a list of modules.
Also, the number of lookups in ets tables is reduced, which has also
improved the performance when analysing and resetting cover data.
|
|
* raimo/infinite-loop-gethostbyname/OTP-12133:
Remove infinite loop in inet:gethostbyname_tm/4
|
|
|
|
* bjorn/compiler/beam_jump:
beam_jump: Eliminate pathologically slow compilation
|
|
* bjorn/compiler/beam_validator:
beam_validator: Exit immediately on crashes
beam_validator: Remove the file/1 and files/1 functions
beam_validator: Remove support for all other unsupported instructions
beam_validator: Remove support for unsupported bit syntax instructions
|
|
* bjorn/compiler/maps:
beam_validator: Tighten and simplify map validation code
beam_utils: Correct test for has_map_fields in is_pure_test/1
map_SUITE: Cover comparisons of 'nil' in v3_codegen
|
|
649d6e73 simplified opt_simple_let_2/6 a little bit too much,
so that some list comprehensions in effect context were not
properly tail-recursive.
|
|
José Valim noticed that code such as:
match(1) -> 1;
match(2) -> 2;
match(3) -> 3;
...
match(1000) -> 1000.
would compile very slowly. The culprit is opt/3 in beam_jump.
What happens is that opt/3 will rewrite this code:
select_val ...
label 1
jump 1000
label 2
jump 1000
...
label 999
jump 1000
label 1000
return
very slowly to this code:
select_val ...
label 1
label 2
...
label 999
label 1000
return
The reason for the slowness is that when opt/3 sees this
sequence:
label 1
jump 1000
...
it will remove the label (storing it in a dictionary),
and pick up the previously processed instruction from
the accumulator:
select_val ...
jump 1000
label 2
jump 1000
...
That is done in order to process all labels before the
jump and also to get rid of the jump instruction if the
previous instruction is an "unreachable after". In this
case, re-processing the sequence will remove the now
unreachable jump instruction:
select_val ...
label 2
jump 1000
...
The problem is that re-processing the select_val instruction is
expensive. The instruction has a list of 1000 labels, all of which
will be added (again) to the set of referenced labels. The
select_val instruction will be re-processed again and again
until all labels and jumps have been gobbled up.
In the original version of beam_jump, opt/3 was not called
repeatedly until a fixpoint was found, but was expected to do
all its optimizations in one pass. The fixpoint iteration was
added later.
Since we now have the fixpoint iteration, there is no need
to do everything in a single pass. When we encounter a jump, we will
collect all previously seen labels and put them into the dictionary,
and then we will move on.
As a further optimization, we will look for sequences like this:
jump X
label ...
jump X
and replace them with:
label ...
jump X
In the example above, that will avoid 1000 updates of the dictionary.
After applying this optimization, compilation of the
pattern went from roughly 55 s to 0.1 s for the example
above but with 10000 clauses.
Reported-by: José Valim
|
|
|
|
* ethercrow/export_gen_udp_socket:
Export type gen_udp:socket/0
|
|
The code sharing optimization could produce a jump into the
middle of a 'try' block. beam_validator would reject the code.
Reported-by: Ulf Norell
|
|
|
|
* dgud/erlang/pr/116:
observer: Add SASL log view for processes
|
|
Add a new menu to toggle log view.
Disabled by default.
Disabled if rb_server already started on observed node,
in order not to interfere with somebody else.
If enabled, add a tab in process view where log entries
related to pid process are shown.
Need an observed node with at least a version R16B2,
due to the use of newly capability to rb to write into
a file descriptor (on the observing node).
|
|
Stop traversing all segments and buckets of empty
dictionaries by adding a clause that checks the
dictionary size.
This improved compilation of an erlang project from
7.5s to 5.5s seconds when trying out a sample
implementation of erl_lint that uses dicts.
|