Age | Commit message (Collapse) | Author |
|
beam_bool would crash when attempting to optimize BEAM code similar
to this code:
bif '=:=' Reg1 SomeValue => y(0)
bif '=:=' Reg2 {atom,true} => x(2)
bif '=:=' Reg3 {atom,true} => x(3)
bif 'or' x(2) x(3) => x(2)
is_eq_exact Fail x(2) {atom,true}
The problem is that the first instruction that assigns a value to a Y
register. beam_bool:ssa_assign/2 will not accept a Y register
argument.
We could change ssa_assign/2 to accept a Y register, but that would
only cause the entire optimization to be rejected later because the Y
register is alive in the code that follows. Therefore, a better
solution is to modify extend_block/3 so that the instruction that
assign to Y registers are not added to the block. That is, the
optimizer will only operate on the following code:
bif '=:=' Reg2 {atom,true} => x(2)
bif '=:=' Reg3 {atom,true} => x(3)
bif 'or' x(2) x(3) => x(2)
is_eq_exact Fail x(2) {atom,true}
Usually the optimization will succeed, rewriting the four instructions
to a select_val instruction.
Assembly code such as the above can be produced by code similar to:
Y = Something == SomethingElse,
case Y of
Condition; OtherCondition ->
. . .
end,
. . .,
Y.
Reported-by: http://bugs.erlang.org/browse/ERL-143
Reported-by: José Valim
|
|
It's time that we have a dedicated test suite for beam_bool.
|
|
Two test cases were not actually run. Even if their main purpose is to
ensure that the compiler doesn't crash, we always try to also run the
test case (when practial) to also ensure that the generated code is
correct.
|
|
* egil/erts/nif-format_term/OTP-13580:
runtime_tools: Change erts_snprintf to enif_snprintf
erts: Document enif_snprintf
erts: Add tests for enif_snprintf
erts: Add enif_snprintf
Conflicts:
erts/emulator/beam/erl_nif_api_funcs.h
|
|
* egil/tools/fix-unmatched_return/OTP-13595:
xref: Fix unmatched return warnings
tags: Fix unmatched return warnings
lcnt: Fix unmatched return warnings
fprof: Fix unmatched return warnings
fprof: Fix unmatched return warnings
eprof: Fix unmatched return warnings
cover: Fix unmatched return warnings
|
|
* egil/runtime_tools/fix-unmatched_return/OTP-13595:
runtime_tools: Fix unmatched return warnings
|
|
* egil/os_mon/fix-unmatched_return/OTP-13595:
os_mon: Fix unmatched return warnings
|
|
* egil/et/fix-doc-lint:
et: Fix linting documentation xml tags
|
|
* egil/runtime_tools/fix-doc-lint:
runtime_tools: Fix tags of dbg reference manual
runtime_tools: Fix tags of LTTng User's Guide
|
|
* egil/percept/fix-ug-doc:
egd: Fix User's Guide lint
|
|
* egil/erts-epmd/modernize-tests:
Eliminate use of doc and suite clauses
Replace use of test_server:format/2 with io:format/2
Modernize use of timetraps
Remove ?line macros
|
|
* bjorn/asn1/dialyzer-warnings/OTP-13579:
Eliminate dialyzer warnings for unmatched returns
|
|
* bjorn/common_test/dialyzer-warnings:
ct_logs: Eliminate dialyzer warnings
|
|
* mururu/stdlib/fix-deprecated-warnings/PR-1050/OTP-13594:
Fix deprecated warnings
|
|
* bjorn/compiler/badfun-literal/ERL-138/OTP-13552:
sys_core_fold: Don't generated failing calls such as 3(4)
fun_SUITE: Test for failing calls to funs
|
|
|
|
|
|
|
|
Dialyzer's dependency calculation was throwing an error when
encountering an 'apply' node with something that was not a variable
(e.g., a literal). The rest of the code did not know what to do with
this error, which resulted in dialyzer crashing. Fix this by ingoring
the detected error in the dependency calculation phase; later dialyzer
passes know how to properly handle and report this kind of errors
anyway.
This fixes [Erlang-JIRA] (ERL-138).
|
|
Fix mistakes found by 'xmllint'.
|
|
Fix mistakes found by 'xmllint'.
|
|
|
|
* egil/update-gitignore:
Update .gitignore
|
|
|
|
|
|
|
|
|
|
Rewrite code such as:
X = not_a_fun,
X()
to:
error({badfun,not_a_fun})
Also generate a warning.
|
|
|
|
|
|
|
|
This reverts commit bd64ad8e15d66e48b36dbe3584315dd5cfc8b59a.
|
|
Dialyzer complains that three calls to gen_dec_line/7 ignore
the return value. It turns out that when the last argument to
gen_dec_line/7 is 'false', the return value will always be
{[],[]}. Introduce gen_dec_line/6 as helper to make it clear
that we don't ignore a useful return value.
|
|
|
|
|
|
|
|
|
|
|
|
* ingela/ssl/test-cuddle:
ssl: Correct test suite
|
|
* lukas/trace-fix:
erts: Only allow remove from trace_status callback
|
|
* rickard/ds-proc-exit/OTP-13123:
Add dirty_heap_access test case
Add dirty_call_while_terminated test case
Move dirty nif test cases into dirty_nif_SUITE
Add better support for communication with a process executing dirty NIF
Remove conditional dirty schedulers API
|
|
Make it so that it is only possible to remove a tracer via
returning remove from an erl_tracer. This limition is put in
place in order to avoid a lot of lock checking and taking
in various places, especially in regards to trace events
happening on dirty schedulers.
|
|
|
|
|
|
|
|
- Termination of a process...
- Modify trace flags of process...
- Process info on process...
- Register/unregister of name on process...
- Set group leader on process...
... while it is executing a dirty NIF.
|
|
* Add the capability to format erlang terms to a char buffer in nifs.
* Bump NIF version to 2.11
|
|
* lukas/erts/max_heap_size/OTP-13174:
erts: Fix non-smp max_heap_size assert
|
|
|
|
* lukas/erts/max_heap_size/OTP-13174:
erts: Add max_heap_size remote gc testcase
|