Age | Commit message (Collapse) | Author |
|
* john/compiler/improve-validator-type-inference/ERL-998:
beam_validator: Improve type inference on inequality
beam_validator: Remove redundant calls to infer_types
|
|
* john/erts/merge-fd-file-info/OTP-15956:
file: allow read_file_info on file descriptors
|
|
|
|
* maint:
Updated OTP version
Prepare release
# Conflicts:
# OTP_VERSION
# make/otp_version_tickets_in_merge
|
|
* maint-22:
Updated OTP version
Prepare release
# Conflicts:
# make/otp_version_tickets
|
|
Both sides need to be inferred, and we should infer as if we've
made an exact match when we know that LHS is single-valued. This
was done for select_val, but we failed to do so for is_ne_exact
et al.
|
|
|
|
* maint:
compiler: Fix compiler crash introduced by OTP-15952
|
|
into maint
* john/compiler/fix-bad-try_catch-recv-fix/OTP-15953/ERL-999:
compiler: Fix compiler crash introduced by OTP-15952
|
|
|
|
An assertion in code generation would fail when the common exit
block was ?BADARG_BLOCK, as some operations expect to always "fail"
directly to that block (= throw an exception) and we had inserted
a dummy block in between.
Other operations could also get funny fail labels, jumping to
blocks that immediately jumped to {f,0}, but these were all cleaned
up by beam_jump, sweeping the bug under the rug.
|
|
* maint:
Updated OTP version
Prepare release
# Conflicts:
# OTP_VERSION
# make/otp_version_tickets_in_merge
|
|
* maint-22:
Updated OTP version
Prepare release
# Conflicts:
# make/otp_version_tickets
|
|
|
|
* ingela/ssl/alert-error-enhancment/OTP-15943:
ssl: Enhance error handling
|
|
maint-22
* john/compiler/fix-fail-path-exceptions-bsm/OTP-15946:
beam_ssa_bsm: Leave ?BADARG_BLOCK alone when cloning fail path
|
|
* john/compiler/fix-unsafe-tuple_size-opt/OTP-15945:
beam_ssa_opt: Do not apply tuple_size optimization outside guards
|
|
* john/hipe/catch-miscompilation/OTP-15949:
dialyzer: Remove native code compilation
hipe: Disable compilation on encountering try/catch
|
|
* maint:
compiler: Fix broken 'receive' in try/catch blocks
|
|
* john/compiler/fix-try_catch-receives/OTP-15952:
compiler: Fix broken 'receive' in try/catch blocks
|
|
This fix is rather ugly and tacked-on, but I'm not comfortable
refactoring the pass in an emergency patch.
|
|
* maint:
Refine test cases
Remove test code that fails on Windows
|
|
* raimo/udp-send-TOS/OTP-15422:
Refine test cases
Remove test code that fails on Windows
|
|
|
|
|
|
|
|
|
|
The function 'snmp:print_version_info/0' which prints
various (version) info, attempted to extract the
"compile time" of each module in the snmp app.
This info used to be availabe in the module_info of
each module, but has been removed (a "long" time ago).
This resulted in a pointless "Not Found" beeing printed.
This has now been removed from the into printed.
OTP-15330
|
|
|
|
|
|
OTP-15932
|
|
|
|
|
|
Extend the compiler's type representation
|
|
* maint:
dialyzer: Remove native code compilation
hipe: Disable compilation on encountering try/catch
|
|
* john/hipe/catch-miscompilation/OTP-15949:
dialyzer: Remove native code compilation
hipe: Disable compilation on encountering try/catch
|
|
Eagerly extracting elements can be quite problematic now that we
have union types. Consider the following:
0:
%% _0 is {ok, #record{}} | {error,atom()}
_1 = get_tuple_element _0, literal 0
_2 = get_tuple_element _0, literal 1
switch _1, label 0, [ { literal ok, label 1 }, { literal error, label 2 } ]
1:
%% _0 is known to be {ok,#record{}} here
2:
%% _0 is known to be {error,atom()} here
The type pass is clever enough to see that _0 has the types noted
above, but because the type of _2 is set in the first block where
we didn't have that information yet, it's still #record{} | atom()
in both branches.
Sinking these instructions to when they are used greatly improves
the type information in many cases, but it does have a few
limitations and using it in both of the above branches would take
us back to square one.
|
|
If we know that the checked value is a singleton at the fail
block, it's safe to infer types as if we've made a direct
comparison against that value.
|
|
|
|
* sverker/ets_SUITE-fixtable_iter_bag:
stdlib: ets_SUITE:fixtable_iter_bag
|
|
Turns out the bug in ets:next() that I tried to provoke
with this new test wasn't really there. Oh well.
|
|
code_SUITE:upgrade would consistently fail in the HiPE case
because two clauses were mixed up. Disabling it altogether may
seem a bit harsh but we don't have the resources to fix it at the
moment.
|
|
Collect unused vars instead of used ones
|
|
|
|
|
|
Consider the type `{ok, #record{}} | {error,atom()}`; in our
current type representation this will be flattened down to
`{ok | error, #record{} | atom()}`, which is fairly useful but has
no connection between the elements. Testing that the first element
is 'error' lets us skip checking that it's 'ok' on failure, but the
second element is still `#record{} | atom()` and we'll eventually
need to test that, even though it can only be a `#record{}`.
Another example would be `false | {value, term()}`, the return
value of lists:keyfind/3, which we're forced to flatten to `any`
since there's nothing in common between an atom and a tuple.
Union types let us express these types directly, greatly improving
type optimization.
|
|
|
|
Whenever there's a type conflict during type inference we know
that the branch will not be taken. Previously we'd go down the
branch with garbage type information which would crash in some
cases.
There's no test case for the crashes because the ones I've found
require union types to happen, and we already have good coverage
once they're in place.
|
|
When the compiler is smart enough to figure out that something
will always succeed, it will get rid of the failure branch, but
the inverse has not been possible because liveness optimization
could end up removing the instruction altogether (since it's never
used on the failure path), which is not okay when exceptions are in
the picture.
To prevent exception-generating instructions from being optimized
away when their branches are, we introduce a dummy instruction
that refers to the result on the failure path, ensuring that it
won't be optimized away.
|
|
|