aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2017-03-16hipe: Add range splitter range_splitMagnus Lång
hipe_range_split is a complex live range splitter, more sophisticated thatn hipe_restore_reuse, but still targeted specifically at temporaries forced onto stack by being live over call instructions. hipe_range_split partitions the control flow graph at call instructions, like hipe_regalloc_prepass. Splitting decisions are made on a per partition and per temporary basis. There are three different ways in which hipe_range_split may choose to split a temporary in a program partition: * Mode1: Spill the temp before calls, and restore it after them * Mode2: Spill the temp after definitions, restore it after calls * Mode3: Spill the temp after definitions, restore it before uses To pick which of these should be used for each temp×partiton pair, hipe_range_split uses a cost function. The cost is simply the sum of the cost of all expected stack accesses, and the cost for an individual stack access is based on the probability weight of the basic block that it resides in. This biases the range splitter so that it attempts moving stack accesses from a functions hot path to the cold path. hipe_bb_weights is used to compute the probability weights. mode3 is effectively the same as what hipe_restore_reuse does. Because of this, hipe_restore_reuse reuses the analysis pass of hipe_restore_reuse in order to compute the minimal needed set of spills and restores. The reason mode3 was introduced to hipe_range_split rather than simply composing it with hipe_restore_reuse (by running both) is that such a composition resulted in poor register allocation results due to insufficiently strong move coalescing in the register allocator. The cost function heuristic has a couple of tuning knobs: * {range_split_min_gain, Gain} (default: 1.1, range: [0.0, inf)) The minimum proportional improvement that the cost of all stack accesses to a temp must display in order for that temp to be split. * {range_split_mode1_fudge, Factor} (default: 1.1, range: [0.0, inf)) Costs for mode1 are multiplied by this factor in order to discourage it when it provides marginal benefits. The justification is that mode1 causes temps to be live for longest, thus leading to higher register pressure. * {range_split_weight_power, Factor} (default: 2, range: (0.0, inf)) Adjusts how much effect the basic block weights have on the cost of a stack access. A stack access in a block with weight 1.0 has cost 1.0, a stack access in a block with weight 0.01 has cost 1/Factor. Additionally, the option range_split_weights chooses whether the basic block weights are used at all. In the case that the input is very big, hipe_range_split automatically falls back to hipe_restore_reuse only in order to keep compile times under control. Note that this is not only because of hipe_range_split being slow, but also due to the resulting program being slow to register allocate, and is not as partitionable by hipe_regalloc_prepass. hipe_restore_reuse, on the other hand, does not affect the programs partitionability. The hipe_range_split pass is controlled by a new option ra_range_split. ra_range_split is added to o2, and ra_restore_reuse is disabled in o2.
2017-03-16hipe: Add module computing basic blocks weightsMagnus Lång
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.
2017-03-16hipe: Add branch prediction accessor ra callbacksMagnus Lång
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.
2017-03-16hipe: Add range splitter restore_reuseMagnus Lång
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.
2017-03-16hipe: Add basic range splitting ra callbacksMagnus Lång
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.
2017-03-16hipe: Add basic_edge_cases test caseMagnus Lång
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).
2017-03-16hipe: Extract disjoint sets to its own moduleMagnus Lång
2017-03-16hipe_x86_subst: Fix bug with zero-arity #fp_unop{}Magnus Lång
2017-03-16ssl: Remove deprecated functionsIngela Anderton Andin
2017-03-16Don't allow module names with non-latin1 charactersBjörn Gustavsson
In OTP 20, all Unicode characters are allowed in atoms. However, we have decided that we will not allow non-latin1 characters in module names in OTP 20. This restriction may be lifted in a future major release of OTP. Enforce the restriction in erl_lint, so that it will be a compilation error to have a module name containing non-latin1 characters. That means that tools such as debugger, xref, dialyzer, syntax_tools, and so on, do not have to be modified to handle non-latin1 module names.
2017-03-16Merge branch 'vans163/patch-1/PR-1319'Ingela Anderton Andin
* vans163/patch-1/PR-1319: Update inet.xml. Note buffer relation to MTU
2017-03-16Update inet.xml. Note buffer relation to MTUvans163
The documentation does not indicate this is the buffer responsible for the maximum bytes we can receive from a recv call.
2017-03-16Merge branch 'ingela/ssl/dtls-test'Ingela Anderton Andin
* ingela/ssl/dtls-test: dtls: Correct version check dtls: Test case fixes
2017-03-16update doc (#1365)getong
Update erl_interface tutorial docs to work reflect a more modern erl_interface environment
2017-03-16Merge pull request #1375 from lrascao/fix/sbct_docLukas Larsson
Fix sbct documentation
2017-03-16Merge branch 'siri/edoc/testcuddle'Siri Hansen
* siri/edoc/testcuddle: Run preprocess when generating xmerl documentation in test
2017-03-16Merge remote-tracking branch ↵Hans Bolinder
'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
2017-03-15Merge branch 'bjorn/stdlib/erl_tar'Björn Gustavsson
* bjorn/stdlib/erl_tar: erl_tar: Close files after reading from a tar file
2017-03-15Remove default clauses that cause exceptions for internal errorsBjörn Gustavsson
Just crash if there is an internal error.
2017-03-15Merge pull request #1373 from richcarl/edoc-no-timstampsBjörn Gustavsson
edoc: Don't generate timestamps in footer OTP-14277
2017-03-15Merge pull request #1371 from aggelgian/fix-otp-internalBjörn Gustavsson
Fix unhandled exceptions in otp_internal module
2017-03-15Merge pull request #1374 from bjorng/bjorn/compiler/fix-beam_typeBjörn Gustavsson
beam_type: Avoid an internal consistency check failure
2017-03-15Merge branch 'dgud/otp_build_clean_configure'Dan Gudmundsson
* dgud/otp_build_clean_configure: Clean configure when before invoking autoconf
2017-03-15Merge branch 'egil/sigterm-fixup'Björn-Egil Dahlberg
* egil/sigterm-fixup: erts: Fix signal pipe erts: Fix os_signal_SUITE test
2017-03-14Merge branch 'maint'Rickard Green
* maint: Updated OTP version Prepare release Conflicts: OTP_VERSION lib/typer/doc/src/notes.xml lib/typer/vsn.mk
2017-03-14Updated OTP versionOTP-19.3Erlang/OTP
2017-03-14Prepare releaseErlang/OTP
2017-03-14Clean up commentsBjörn Gustavsson
* Remove out-commented code * Fix obvious typos and bad grammar * Adhere to the conventions for when to use "%" and "%%".
2017-03-14Merge branch 'hasse/hipe/remove_work_around'Hans Bolinder
* hasse/hipe/remove_work_around: hipe: Remove work around for Dialyzer bug
2017-03-14Merge branch 'hasse/fix_erl_anno_use'Hans Bolinder
* 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
2017-03-14Fix sbct documentationLuis Rascao
The unit should be explicitly documented as kilobytes to avoid ambiguity.
2017-03-14Merge pull request #1342 from dgud/dgud/observer/max_and_dirty_sched/OTP-14137Dan Gudmundsson
2017-03-14erts: Fix signal pipeBjörn-Egil Dahlberg
2017-03-14Clean up asn1ct_gen:emit/1Björn Gustavsson
Remove blank lines between clauses; use matching instead of is_list/1 guards.
2017-03-14Remove unused clauses in asn1ct_gen:emit/1Björn Gustavsson
2017-03-14Clean up use of asn1ct_gen:emit/1Björn Gustavsson
Stop up using asn1ct_gen:emit/1 with a tuple instead of a list. Also remove the remaining uses of asn1ct_gen:demit/1.
2017-03-14Remove the 'debug' optionBjörn Gustavsson
The debug option no longer serves any useful purpose.
2017-03-14Only generate needed single quotes around function namesBjörn Gustavsson
That will make code slightly easier to read.
2017-03-14asn1ct_gen_ber_bin_v2: Remove unused codeBjörn Gustavsson
The code is not covered. The code is also not present in the PER backend. Here is a somewhat more formal proof that the code cannot be reached: asn1ct_gen_ber_bin_v2:gen_encode_user/3 calls asn1ct_gen:gen_encode_constructed/4 where Typename is a list of one element. asn1ct_gen:gen_encode_constructed/4 will call asn1ct_gen_ber_bin_v2:gen_encode/3 via asn1ct_gen:gen_types/4. Note that if InnerType in asn1ct_gen:gen_encode_constructed/4 is 'SEQUENCE OF' or 'SET OF', Typename will be extended to a list with two elements. If InnerType in asn1ct_gen:gen_encode_constructed/4 is 'SET', 'SEQUENCE', or 'CHOICE', then asn1ct_gen_ber_bin_v2:gen_encode/3 will be called with the last argument being a #'ComponentType'{}. asn1ct_gen_ber_bin_v2:gen_encode/3 will in that cause extend Typename before calling itself recursively. Therefore, Typename is always a list with at least two elements when the removed code is called.
2017-03-14asn1ct_gen_per: Fix broken dialyzer suppression functionBjörn Gustavsson
ce431409d0daba broke generation of dialyzer suppressions for per and uper. While we are it, add type tests to asn1ct_func:is_used/1 to avoid similar problems in the future.
2017-03-14asn1_erl_nif.c: Correct handling of tags >= 16384Björn Gustavsson
Tags number above 16383 were not decoded correctly in ber_decode_tag(). We could fix the problem, but there does not seem to be any need. First, the only way that high tag numbers can be created is with manual tagging; after 1994 manual tagging is no longer recommended. Second, the ASN.1 playground (http://asn1-playground.oss.com) only supports tags up to 16383 (the same is presumably true for OSS Nokalva's other tools). Therefore, clean up the existing code and make it an explicit 'invalid_tag' error when tags above 13383 are encountered (instead of an implicit 'wrong_tag' error).
2017-03-13Merge branch 'maint'Rickard Green
* maint: Fix xml warnings in old release notes
2017-03-13Fix xml warnings in old release notesRickard Green
2017-03-13Merge pull request #1370 from dalizard/fix-typos-eunit-docBjörn Gustavsson
Fix small typos
2017-03-13beam_type: Avoid an internal consistency check failureBjörn Gustavsson
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
2017-03-13erts: Fix os_signal_SUITE testBjörn-Egil Dahlberg
2017-03-13Fix small typosDimitar Haralanov
2017-03-13Clean configure when before invoking autoconfDan Gudmundsson
Autoconf doesn't remake configure if creation time on configure.in is older than the previous version. This caused problems on windows so always recreate configure when running ./otp_build autoconf
2017-03-13edoc: Don't generate timestamps in footerRichard Carlsson
2017-03-13Merge branch 'wiml/crypto/rsa-generate-key/ERL-165/PR-1299/OTP-14140'Hans Nilsson