Age | Commit message (Collapse) | Author |
|
Use cerl:make_list/1 instead of a home-made make_list/1 to ensure that
literal lists are constructed as literals. In a future release, we
would like to forbid in the loader construction of literal lists using
instructions like:
put_list {atom,a} [] Dst
The proper way is:
move {literal,[a]} {x,0}
Also update the comment about "put_list Const [] Dst" in ops.tab.
|
|
In 1f0ae04d374, a complete register map was introduced in the %live
instructions thar are added by beam_utils:live_opt/1.
Use the register map to improve beam_utils:is_killed_block/2.
|
|
* egil/fix-dyntrace-test:
runtime_tools: Skip dyntrace test if LTTng is enabled
|
|
Several improvements in the compiler (e.g. c288ab87fd6) has
lead to an Y register being the target for get_tuple_element
instructions. Therefore, introduce i_get_tuple_element2y
that combines two consecutive get_tuple_element instructions
that target Y registers.
|
|
packed_registers/1 may have actually tested put_list/3 instructions
with high register numbers at some time. Currently, the compiler
will generate code that only uses low register numbers.
Totally rewrite the test case. It is difficult to arrange so that
put_list/3 uses three high register numbers, so we will use
get_list/3 instructions with high register numbers.
|
|
0a4750f91c83 optimized unpacking by removing a mask operation
when unpacking three packed operands. Unfortunately, that optimization
is only safe on 64-bit architectures.
Here is what happens on 32-bit architectures.
The operands to be packed are 10-bit register numbers that have been
turned into byte offsets:
aaaaaaaaaa00
bbbbbbbbbb00
cccccccccc00
They can be packed into a single word like this:
30 20 10 0
| | | |
aa aaaaaaaabb bbbbbbbbcc cccccccc00
If we call the packed word P, the original operands can be
extracted like this:
C = P band 2#111111111100
B = (P bsr 10) band 2#111111111100
A = (P bsr 20) band 2#111111111100
The bug was that A was extracted without the masking:
A = P bsr 20
That would give A the value:
aaaaaaaaaaaabb
That would only be safe if the two most significant bits in B
were zeroes.
|
|
There is a '#ifdef ARCH_64' beam_opcodes.h, which might make you
think that files generated by beam_makeops will work for both
32-bit and 64-bit architectures. They will not. beam_makeops will
generate different code depending on its -wordsize option.
|
|
|
|
|
|
* egil/erts/opt-list_append/OTP-13487:
erts: Optimize '++' operator
|
|
* egil/tools/modernize-tests:
tools: Don't divide by zero in tests
Fix instruments_SUITE sumblock check
Eliminate use of doc and suite clauses
Replace ?t with test_server
Use test_server:is_debug/0 instead of custom check
Replace use of test_server:format/2 with io:format/2
Eliminate use of ?config() macro
Eliminate use of test_server:fail/0,1
Eliminate erlang:now/0
Modernize use of timetraps
Remove ?line macros
|
|
It's not just ok to throw badarg, it MUST throw badarg.
|
|
|
|
|
|
* siri/otp-19-vsns:
Update version of common_test for OTP-19
Update versions
|
|
* siri/ct/mods-in-app-file/OTP-13475:
Don't add explicit path to ct_release_test
Add missing modules to common_test.app.src
|
|
* henrik/update-copyrightyear:
update copyright-year
|
|
|
|
|
|
|
|
|
|
* msantos/erts/cli-abort-on-alloc-fail/PR-948/OTP-13486:
erts/common: check for OOM on Windows
|
|
* egil/erts-lib/modernize-tests:
Replace test_server:os_type/0 with os:type/0
Eliminate use of doc and suite clauses
Replace use of test_server:format/2 with io:format/2
Eliminate use of test_server:fail/0,1
Eliminate use of ?config() macro
Modernize use of timetraps
Remove ?line macros
|
|
|
|
beam_jump fails to optimize the following:
jump 2
label 1
label 2
Since this situation is rare, instead of complicating beam_jump,
add the optimization to beam_peep. It will always succeed, since
adjacent labels have been coalesced.
|
|
* bjorn/raise:
Remove unreachable code after 'raise' instructions
Simplify the raise instruction to reduce code size
|
|
This also optimizes the BIF lists:append/2
Use one pass to check for properness and copying LHS list.
If LHS turns out not being a proper list, bail and reset htop.
If we run out of heap, allocate a heap-fragment and calculate
the remaining length as normal, thus checking for properness,
and then continue copying.
Measurements shows this being ~50% faster.
|
|
|
|
* egil/erts/fix-process_info-spec/ERL-123/OTP-13485:
Update preloaded erlang.beam
erts: Fix process_info/2 result spec
|
|
* egil/erts/cuddle-tests:
Additional logging for alloc_SUITE
Replace test_server:os_type/0 with os:type/0
Let low_prio test run a bit longer
Increase timetrap for atom_roundtrip_r15b
Remove unnecessary ct boilerplate in suite
Don't divide by zero in test logging
Use ct:fail/1 instead of test_server:fail/1
Relax node_container_SUITE
Increase timetrap timeout for op_SUITE:bsl_bsr/1
Increase timetrap timeout for port_SUITE:huge_env/1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This module is now in common_test.app, so it will be included in the
release which is upgraded from (and to).
|
|
This is done early so test of ct_release_test shall work.
|
|
Remove the unreachable instructions after a 'raise' instruction
(e.g. a 'jump' or 'deallocate', 'return') to decrease code size.
|
|
The raise/2 instruction is almost always used like this:
raise x(2) x(1)
Therefore, we can translate it to an internal i_raise/0
instruction that uses x(2) x(1) as its implicit operands.
We will also remove the backward compatibility with R10-0. It is
unlikely that anyone still is using BEAM files compiled with the R10-0
compiler, especially since most of those modules cannot be loaded. The
loader will refuse to load any module that uses the old non-GCIng
arithmetic instructions or the non-GCing versions of length/1 or
size/1.
Doing these changes will reduce both the size of the loaded BEAM
code and size of the code in process_main().
|
|
to let future nodes know that we can handle
NEW_PID_EXT, NEW_PORT_EXT and NEWER_REFERENCE_EXT.
|
|
|
|
|
|
|
|
from future nodes.
|
|
Increase max number of messages sent to fill buffers.
|
|
|
|
Instead of INTERNAL_CREATION (255), use empty atom for node name
to mean the local node (regardless of node name or creation).
The purpose is to get rid of special value 255, for future expansion
of creation to 32-bit.
|
|
|
|
|