aboutsummaryrefslogtreecommitdiffstats
path: root/lib
AgeCommit message (Collapse)Author
2015-08-21Put 'try' in blocks to optimize allocation instructionsBjörn Gustavsson
Put 'try' instructions inside block to improve the optimization of allocation instructions. Currently, the compiler only looks at initialization of y registers inside blocks when determining which y registers that will be "naturally" initialized.
2015-08-21Reorder instructions across try/catchBjörn Gustavsson
Simplify further optimizations by moving safe instructions to before the 'try' or 'catch' instruction.
2015-08-21Delay get_tuple_element instructions until they are neededBjörn Gustavsson
When matching tuples, the pattern matching compiler would generate code that would fetch all elements of the tuple that will ultimately be used, *before* testing that (for example) the first element is the correct record tag. For example: is_tuple Fail {x,0} test_arity Fail {x,0} 3 get_tuple_element {x,0} 0 {x,1} get_tuple_element {x,0} 1 {x,2} get_tuple_element {x,0} 2 {x,3} is_eq_exact Fail {x,1} some_tag If {x,2} and {x,3} are not used at label Fail, we can re-arrange the code like this: is_tuple Fail {x,0} test_arity Fail {x,0} 3 get_tuple_element {x,0} 0 {x,1} is_eq_exact Fail {x,1} some_tag get_tuple_element {x,0} 1 {x,2} get_tuple_element {x,0} 2 {x,3} Doing that may be beneficial in two ways. If the branch is taken, we have eliminated the execution of two unnecessary instructions. Even if the branch is never or rarely taken, there is the possibility for more optimizations following the is_eq_exact instructions. For example, imagine that the code looks like this: get_tuple_element {x,0} 1 {x,2} get_tuple_element {x,0} 2 {x,3} move {x,2} {y,0} move {x,3} {y,1} Assuming that {x,2} and {x,3} have no further uses in the code that follows, that can be rewritten to: get_tuple_element {x,0} 1 {y,0} get_tuple_element {x,0} 2 {y,1} When should we perform this optimization? At the very latest, it must be done before opt_blocks/1 in beam_block which does the elimination of unnecessary moves. Actually, we want do the optimization before the blocks have been established, since moving instructions out of one block into another is cumbersome. Therefore, we will do the optimization in a new pass that is run before beam_block. A new pass will make debugging easier, and beam_block already has a fair number of sub passes.
2015-08-21Optimize get_tuple_element instructions by moving them forwardBjörn Gustavsson
2015-08-21beam_block: Improve the move optimizationsBjörn Gustavsson
Here is an example of a move instruction that could not be optimized away because the {x,2} register was not killed: get_tuple_element Reg Pos {x,2} . . . move {x,2} {y,0} put_list {x,2} nil Any We can do the optimization if we replace all occurrences of the {x,2} register as a source with {y,0}: get_tuple_element Reg Pos {y,0} . . . put_list {y,0} nil Dst
2015-08-21beam_block: Clean up optimization of move optimizationsBjörn Gustavsson
The 'move' optimization was relatively clean until GC BIFs were introduced. Instead of re-thinking the implementation, the existing code was fixed and patched. The current code unsuccessfully attempts to eliminate 'move' instructions across GC BIF and allocation instructions. We can simplify the code if we give up as soon as we encounter any instruction that allocates.
2015-08-21beam_block: Eliminate redundant wasteful call to opt/1Björn Gustavsson
opt_alloc/1 makes a redundant call to opt/1. It is redundant because the opt/1 function has already been applied to the instruction sequence prior to calling opt_alloc/1.
2015-08-06Teach the compiler the 'da' and 'dz' optionsBjörn Gustavsson
Add the 'da' option to create a list after the beam_a pass. Seeing how the code looks after beam_a, but before the blocks have been established, is sometimes useful. For symmetry, add the 'dz' option, even though it is just a synonym for 'S'.
2015-07-05Merge branch 'maint'Hans Nilsson
* maint: ssh: be more generous about disconnect expects ssh: add disjunction to ssh_trpt_test_lib:match
2015-07-04ssh: be more generous about disconnect expectsHans Nilsson
2015-07-04ssh: add disjunction to ssh_trpt_test_lib:matchHans Nilsson
2015-07-03Merge branch 'maint'Björn-Egil Dahlberg
2015-07-03Merge branch 'egil/update-gitgnore' into maintBjörn-Egil Dahlberg
2015-07-03mnesia: Update gitignoreBjörn-Egil Dahlberg
2015-07-03Merge branch 'maint'Hans Nilsson
* maint: ssh: testcases for no common algorithms in key exchange
2015-07-03Merge branch 'hans/ssh/no_common_algs/OTP-11531' into maintHans Nilsson
* hans/ssh/no_common_algs/OTP-11531: ssh: testcases for no common algorithms in key exchange
2015-07-03Merge branch 'maint'Hans Nilsson
* maint: ssh: Initial ssh_tprt_test_lib.erl and ssh_protocol_SUITE
2015-07-03Merge branch 'hans/ssh/trpt_test_lib/OTP-12858' into maintHans Nilsson
2015-07-03Merge branch 'maint'Ingela Anderton Andin
2015-07-03Merge branch 'ia/ssl/tune-tests' into maintIngela Anderton Andin
* ia/ssl/tune-tests: ssl: Exclude broken OpenSSL version from ECC test ssl: Tune timeouts
2015-07-02ssl: Exclude broken OpenSSL version from ECC testIngela Anderton Andin
2015-07-02ssl: Tune timeoutsIngela Anderton Andin
2015-07-02ssh: testcases for no common algorithms in key exchangeHans Nilsson
2015-07-02ssh: Initial ssh_tprt_test_lib.erl and ssh_protocol_SUITEHans Nilsson
This test lib is intended for deeper testing of the SSH application. It makes it possible to do exact steps in the message exchange to test "corner cases"
2015-07-01Merge branch 'egil/remove-halfword/OTP-12883'Björn-Egil Dahlberg
* egil/remove-halfword/OTP-12883: (21 commits) erts: Remove halfword etp-commands erts: Remove halfword MemKind mseg erts: Remove halfword bases in ETS erts: Remove halfword CHECK_POINTER_MASK erts: Remove halfword relative printf erts: Remove halfword valgrind suppress file erts: Remove halfword specific tests erts: Remove halfword specific allocator types erts: Remove halfword BINARY RELs erts: Remove halfword is_same bases macro erts: Reinstate copy_object over-allocation optimization erts: Remove halfword copy_object_rel erts: Remove halfword object manipulation erts: Remove halfword heap relative comparisions erts: Remove halfword pointer compression erts: Remove halfword basic relative heap operations erts: Remove halfword from configure erts: Remove halfword in lib_src erts: Remove halfword in erl_nif.h erts: Remove halfword in erl_driver.h ...
2015-06-30ssh: correct sftp unicode and iolist bugHans Nilsson
Ssh_sftp.erl handled incorrectly unicode data in ssh_ftp:write_file. There was also problems with some deeper iolists.
2015-06-30ssh: new unicode testsHans Nilsson
2015-06-30ssh: delete ssh_unicode_SUITEHans Nilsson
The tests now have supersets in ssh_basic_SUITE and ssh_sftp_SUITE.
2015-06-24erts: Remove halfword specific testsBjörn-Egil Dahlberg
2015-06-23Prepare releaseErlang/OTP
2015-06-23Merge branch 'ia/ssl/modern-timetrap'Ingela Anderton Andin
* ia/ssl/modern-timetrap: ssl: Make init functions fail if make_certs:all fails ssl: Avoid sleep ssl: modernize timetrap handling
2015-06-22ssl: Make init functions fail if make_certs:all failsIngela Anderton Andin
2015-06-22ssl: Avoid sleepIngela Anderton Andin
When possible avoid sleep in test cases.
2015-06-22ssl: modernize timetrap handlingIngela Anderton Andin
Watchdog is legacy test_server use only ct:timetrap/1
2015-06-22Merge branch 'bruce/change-license'Bruce Yinhe
OTP-12845 * bruce/change-license: fix errors caused by changed line numbers Change license text to APLv2
2015-06-22Merge branch 'kostis/hipe-no-dial-warnings'Henrik Nord
* kostis/hipe-no-dial-warnings: Eliminate a dialyzer warning Simplify handling of o2 and o3 option expansion
2015-06-22fix errors caused by changed line numbersBruce Yinhe
2015-06-22dialyzer: Correction of last commitHans Bolinder
2015-06-22Merge branch 'anders/diameter/18/OTP-12588'Anders Svensson
* anders/diameter/18/OTP-12588: vsn -> 1.10 Remove dead upgrade-related code Update appup for 18 Fix release note typo Fix comment typo
2015-06-22Merge branch 'anders/diameter/sctp/OTP-12768'Anders Svensson
* anders/diameter/sctp/OTP-12768: Fix connection timeouts in test transports Fix start order of alternate transports Log discarded answers Ensure accepting processes are first in, first out Remove upgrade-related code Be less parallel in traffic suite Increase send/receive buffers for testsuite SCTP listeners Decrease unnecessarily long testsuite timetraps Simplify accepting transport start Simplify peeloff signaling Simplify socket close at terminate Don't monitor listener after peeloff Don't receive initial messages out of order Remove assumption that SCTP association ids will be unique
2015-06-22Merge branch 'anders/diameter/grouped_errors/OTP-12721'Anders Svensson
* anders/diameter/grouped_errors/OTP-12721: Fix decode of Grouped AVPs containing errors Simplify logic Simplify logic
2015-06-21Fix connection timeouts in test transportsAnders Svensson
Without a timeout, TCP/SCTP connect can take some time to fail, which resulted in failures in the pool suite after the parent commit fixed the previously faulty sctp-first-then-tcp connect.
2015-06-21Fix start order of alternate transportsAnders Svensson
A transport configured with diameter:add_transport/2 can be passed multiple transport_module/transport_config tuples in order to specify alternate configuration, modules being attempted in order until one succeeds. This is primarily for the connecting case, to allow a transport to be configured to first attempt connection over SCTP, and then TCP in case SCTP fails, with configuration like that documented: {transport_module, diameter_sctp}, {transport_config, [...], 5000}, {transport_module, diameter_tcp}, {transport_config, [...]} If the options are the same in both cases, another possibility would be configuration like this, which attaches the same transport_config to both modules: {transport_module, diameter_sctp}, {transport_module, diameter_tcp}, {transport_config, [...], 5000}, However, in this case the start order was reversed relative to the documented order: first tcp, then sctp. This commit restores the intended order. OTP-12851
2015-06-20vsn -> 1.10Anders Svensson
2015-06-20Remove dead upgrade-related codeAnders Svensson
Not needed with the parent commit's restart_application.
2015-06-20Log discarded answersAnders Svensson
To diameter_lib:log/4, which was last motivated in commit 39acfdb0.
2015-06-19Ensure accepting processes are first in, first outAnders Svensson
A listener process in diameter_sctp starts accepting transport processes as required, either as associations are established or as diameter asks for a processes to be started. Since this can happen in any order, the listener maintains two queues: one for processes that diameter has requested and which are waiting to be given an association, another for processes that have been started to become owners of an association but are waiting for diameter to request them. Only one queue at a time is non-empty. The first queue's length is bounded by the number of accepting processes configured as pool_size. Entries in the second queue are short-lived since diameter starts a replacement transport process whenever an existing one dies or communicates that it has an association. The two queues were previously implemented in an ets ordered_set, whose keys were the pid() of transport processes. Removing an element from the queue was then done with ets:first/1. The problem with this it's not really a queue: there's no guarantee that pid-ordering is the same as the order in which processes are started. If it isn't then it's possible that an established association never be given to diameter as a transport process if there's always a newer association whose pid sorts first. This isn't a problem in practice since it would require new associations to be established faster than diameter starts transport processes, but redo the implementation as a queue, with strict FIFO semantics.
2015-06-19Remove upgrade-related codeAnders Svensson
The changes in some of the previous commits assume application restart.
2015-06-19Be less parallel in traffic suiteAnders Svensson
At the current count, there are 128 groups run in parallel, each of which runs 52 testcases in parallel. That makes for 128*52 = 6656 testcases, which is probably also a factor in the sporadic failures addressed by the parent commit. Don't run the 128 groups in parallel.
2015-06-19Increase send/receive buffers for testsuite SCTP listenersAnders Svensson
The defaults result in sporadic timeouts in the traffic suite after testing over SCTP was added in commit fadf753b. The behaviour looks to be specific to SLES 11, and is presumably the same resends/congestion that lead to the buffers being increased in the gen_sctp suite in commit 12febf13 (and commented in commit e931991f). The behaviour hasn't been seen on SLES 10.