Age | Commit message (Collapse) | Author |
|
* 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.
|
|
|
|
The idea was to look at the argument types to see if we could get
rid of failure branches, but this didn't turn out to be useful and
the function ended up being a copy of erl_bifs:is_safe/3, so we may
as well get rid of it.
|
|
|
|
The previous implementation of infer_types had a general problem
with negative inference, and relied on an ugly hack to make simple
subtraction work for type tests. This gets rid of that hack and
makes it possible to subtract types on tuple size and element
comparisons.
|
|
|
|
|
|
|
|
The test was brainfart; integers that don't overlap *AT ALL*
should never meet. It's okay to meet as long as they overlap to
some degree.
|
|
|