Age | Commit message (Collapse) | Author |
|
hipe_bb_weights computes basic block weights by using the branch
probability predictions as the coefficients in a linear equation system.
This linear equation system is then solved using Gauss-Jordan
Elimination.
The equation system representation is picked to be efficient with highly
sparse data. During triangelisation, the remaining equations are
dynamically reordered in order to prevent the equations from growing in
the common case, preserving the benefit of the sparse equation
representation.
In the case that the input is very big, hipe_bb_weights automatically
falls back to a rough approximation in order to keep compile times under
control.
|
|
Adds a new register allocator callback
Target:branch_preds(Instr, Context) which, for a control flow
instruction Instr, returns a list of tuples {Target, Probability} for
each label name Target that Instr may branch to. Probability is a float
between 0.0 and 1.0 and corresponds to the predicted probability that
control flow branches to the corresponding target. The probabilities may
sum to at most 1.0 (rounding errors aside). Note that a sum less than
1.0 is valid.
|
|
hipe_restore_reuse is a simplistic range splitter that splits temps that
are forced onto the stack by being live over call instructions. In
particular, it attempts to avoid cases where there are several accesses
to such stack allocated temps in straight-line code, uninterrupted by
any calls. In order to achieve this it splits temps between just before
the first access(es) and just after the last access(es) in such
straight-line code groups.
The hipe_restore_reuse pass is controlled by a new option
ra_restore_reuse.
ra_restore_reuse is added to o1.
|
|
In addition to the temporary name rewriting that hipe_regalloc_prepass
does, range splitters also need to be able to insert move instructions,
as well as inserting new basic blocks in the control flow graph. The
following four callbacks are added for that purpose:
* Target:mk_move(Src, Dst, Context)
Returns a move instruction from the temporary (not just register
number) Src to Dst.
* Target:mk_goto(Label, Context)
Returns a unconditional control flow instruction that branches to the
label with name Label.
* Target:redirect_jmp(Instr, ToOld, ToNew, Context)
Modifies the control flow instruction Instr so that any control flow
that would go to a label with name ToOld instead goes to the label
with name ToNew.
* Target:new_label(Context)
Returns a fresh label name that does not belong to any existing block
in the current function, and is to be used to create a new basic
block in the control flow graph by calling Target:update_bb/4 with
this new name.
|
|
Two tests are added, primarily aimed at the range splitters.
* test_float_spills, which exercises the rare case of high floating
point register pressure, including spill slot move coalescing.
* test_infinite_loops, which tests that various infinite loops are
properly compiled and do contain reduction tests (otherwise they
would permanently hog their scheduler and not notice being sent an
exit signal).
|
|
|
|
|
|
* ingela/ssl/dtls-test:
dtls: Correct version check
dtls: Test case fixes
|
|
* siri/edoc/testcuddle:
Run preprocess when generating xmerl documentation in test
|
|
'origin/jparise/parsetools/yecc-header-dot/OTP-14276/PR-1357'
* origin/jparise/parsetools/yecc-header-dot/OTP-14276/PR-1357:
Include ending dot in yecc's Header code example
|
|
* bjorn/stdlib/erl_tar:
erl_tar: Close files after reading from a tar file
|
|
edoc: Don't generate timestamps in footer
OTP-14277
|
|
Fix unhandled exceptions in otp_internal module
|
|
beam_type: Avoid an internal consistency check failure
|
|
* maint:
Updated OTP version
Prepare release
Conflicts:
OTP_VERSION
lib/typer/doc/src/notes.xml
lib/typer/vsn.mk
|
|
|
|
* hasse/hipe/remove_work_around:
hipe: Remove work around for Dialyzer bug
|
|
* hasse/fix_erl_anno_use:
parsetools: Fix handling of locations and annotations
diameter: Fix handling of locations and annotations
kernel: Fix handling of locations and annotations
compiler: Fix handling of locations and annotations
eunit: Fix handling of locations and annotations
Update preloaded
erts: Fix handling of locations and annotations
dialyzer: Fix handling of annotations in a test
debugger: Fix handling of locations and annotations
stdlib: Extend functions in erl_parse to handle form_info()
stdlib: Fix handling of locations and annotations
erts: Correct the documentation of abstract end-of-file
stdlib: Add debug tests to the erl_parse module
stdlib: improve the erl_anno module's debug tests
stdlib: Improve the erl_pp module's debug tests
|
|
|
|
* maint:
Fix xml warnings in old release notes
|
|
|
|
Code such as the following:
-record(x, {a}).
f(R, N0) ->
N = N0 / 100,
if element(1, R#x.a) =:= 0 ->
N
end.
would fail to compile with the following message:
m: function f/2+19:
Internal consistency check failed - please report this bug.
Instruction: {fmove,{fr,0},{x,1}}
Error: {uninitialized_reg,{fr,0}}:
This bug was introduced in 348b5e6bee2f.
Basically, the beam_type pass placed the fmove instruction in the
wrong place. Instructions that store to floating point registers and
instructions that read from floating point registers are supposed to
be in the same basic block.
Fix the problem by flushing all floating points instruction
before a call the pseudo-BIF is_record/3, thus making sure that
the fmove instruction is placed in the correct block.
Here is an annotated listing of the relevant part of the .S
file (before the fix):
{test_heap,{alloc,[{words,0},{floats,1}]},2}.
{fconv,{x,1},{fr,0}}.
{fmove,{float,100.0},{fr,1}}.
fclearerror.
{bif,fdiv,{f,0},[{fr,0},{fr,1}],{fr,0}}.
{fcheckerror,{f,0}}.
%% The instruction {fmove,{fr,0},{x,1}} should have
%% been here.
%% Block of instructions expanded from a call to
%% the pseudo-BIF is_record/3. (Expanded in a later
%% compiler pass.)
{test,is_tuple,{f,3},[{x,0}]}.
{test,test_arity,{f,3},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,2}}.
{test,is_eq_exact,{f,3},[{x,2},{atom,x}]}.
{move,{atom,true},{x,2}}.
{jump,{f,4}}.
{label,3}.
{move,{atom,false},{x,2}}.
{label,4}.
%% End of expansion.
%% The fmove instruction that beam_validator complains
%% about.
{fmove,{fr,0},{x,1}}.
Reported-by: Richard Carlsson
|
|
|
|
|
|
|
|
The bug in Dialyzer is fixed in commit 5ac2943.
|
|
The following calls:
- otp_internal:obsolete(rpc, safe_multi_server_call, 2).
- otp_internal:obsolete(rpc, safe_multi_server_call, 3).
threw an unhandled exception.
The return value has been amended to match the relevant pattern of
obsolete/3.
|
|
|
|
Users wanted to see the maximum value seen by observer during it's uptime.
Note changes faster than the sample rate will still be missed.
|
|
In OTP-20 dirty_schedulers are default on.
Draw them dotted so we can difference between real schedulers
and dirty schedulers.
|
|
|
|
* hasse/dialyzer/fix_plt_suite:
dialyzer: Correct a test case
|
|
|
|
|
|
Also let the test suite verify that all files that are
opened will be closed before the end of each test case.
aa0c4b0df7cdc7 introduced the file descriptor leak.
|
|
* egil/tools/fix-makefile:
tools: Remove percept from makefile
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|