aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler
AgeCommit message (Collapse)Author
2019-07-10Merge branch 'maint-22' into maintJohn Högberg
* maint-22: Updated OTP version Prepare release # Conflicts: # make/otp_version_tickets
2019-07-09Prepare releaseErlang/OTP
2019-07-09Merge branch 'john/compiler/fix-fail-path-exceptions-bsm/OTP-15946' into ↵Erlang/OTP
maint-22 * john/compiler/fix-fail-path-exceptions-bsm/OTP-15946: beam_ssa_bsm: Leave ?BADARG_BLOCK alone when cloning fail path
2019-07-09Merge branch 'john/compiler/fix-unsafe-tuple_size-opt/OTP-15945' into maint-22Erlang/OTP
* john/compiler/fix-unsafe-tuple_size-opt/OTP-15945: beam_ssa_opt: Do not apply tuple_size optimization outside guards
2019-07-09Merge branch 'maint'John Högberg
* maint: compiler: Fix broken 'receive' in try/catch blocks
2019-07-09Merge branch 'john/compiler/fix-try_catch-receives/OTP-15952' into maintJohn Högberg
* john/compiler/fix-try_catch-receives/OTP-15952: compiler: Fix broken 'receive' in try/catch blocks
2019-07-09compiler: Fix broken 'receive' in try/catch blocksJohn Högberg
This fix is rather ugly and tacked-on, but I'm not comfortable refactoring the pass in an emergency patch.
2019-07-08Merge pull request #2318 from jhogberg/john/compiler/union-types/OTP-15892John Högberg
Extend the compiler's type representation
2019-07-05beam_ssa_opt: Sink get_tuple_element before type optimizationJohn Högberg
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.
2019-07-05beam_ssa_type: Infer types on switch failureJohn Högberg
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.
2019-07-05Merge pull request #2314 from josevalim/jv-set-unusedJohn Högberg
Collect unused vars instead of used ones
2019-07-05beam_ssa_type: Subtract more types inferred from '=:='/2John Högberg
2019-07-05beam_call_types: Add lists:keyfind/3 and lists:search/2John Högberg
2019-07-05compiler: Introduce union typesJohn Högberg
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.
2019-07-05compiler: Explain and rename ?BADARG_BLOCKJohn Högberg
2019-07-05beam_ssa_type: Skip impossible branchesJohn Högberg
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.
2019-07-05compiler: Introduce exception trampolinesJohn Högberg
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.
2019-07-05beam_ssa_type: Fix type inference on BIFs without a success checkJohn Högberg
2019-07-05compiler: Remove beam_call_types:never_throws/3John Högberg
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.
2019-07-05beam_validator: Slightly improve type/tag-related commentsJohn Högberg
2019-07-05beam_validator: Improve negative type inferenceJohn Högberg
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.
2019-07-05beam_validator: Clean up abstract/match context type handlingJohn Högberg
2019-07-05beam_call_types: Index must be >= 1 in setelement/2John Högberg
2019-07-05beam_types_SUITE: Fix shrinking of bitstringsJohn Högberg
2019-07-05beam_types: Fix an integer consistency in meet/2John Högberg
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.
2019-07-05beam_types: Extend the type lattice testsJohn Högberg
2019-07-04Collect unused vars instead of used onesJosé Valim
Previously, we would build a large list of used variables only to compute the intersection. This commit changes it to compute the unused variables from given a set which we then subtract from the original set.
2019-07-04Merge branch 'maint'John Högberg
* maint: beam_ssa_bsm: Leave ?BADARG_BLOCK alone when cloning fail path beam_ssa_opt: Do not apply tuple_size optimization outside guards
2019-07-04Merge branch 'john/compiler/fix-fail-path-exceptions-bsm/OTP-15946' into maintJohn Högberg
* john/compiler/fix-fail-path-exceptions-bsm/OTP-15946: beam_ssa_bsm: Leave ?BADARG_BLOCK alone when cloning fail path
2019-07-04Merge branch 'john/compiler/fix-unsafe-tuple_size-opt/OTP-15945' into maintJohn Högberg
* john/compiler/fix-unsafe-tuple_size-opt/OTP-15945: beam_ssa_opt: Do not apply tuple_size optimization outside guards
2019-07-03beam_ssa_bsm: Leave ?BADARG_BLOCK alone when cloning fail pathJohn Högberg
2019-07-03beam_ssa_opt: Do not apply tuple_size optimization outside guardsJohn Högberg
Rewriting `tuple_size` to `is_tuple` + `tuple_size` will cause it not to throw an exception, either crashing the compiler or the emulator when the code runs.
2019-06-27Merge branch 'maint'Björn Gustavsson
* maint: Fix slow compilation of huge functions
2019-06-26Fix slow compilation of huge functionsBjörn Gustavsson
Some huge functions would compile very slowly because of a bottleneck in `beam_ssa:def_used/2`. One example is the `cuter_binlib` module in https://github.com/cuter-testing/cuter. On my computer, this commit reduces the compilatation time for `cuter_binlib` to 45 seconds down from more than 4 minutes. Noticed-by: Kostis Sagonas
2019-06-26Merge branch 'maint'Björn Gustavsson
* maint: Eliminate dialyzer warnings
2019-06-26Add 'make dialyzer' target to top and appsLukas Larsson
2019-06-26Merge branch 'kjell/make_test/OTP-15812'Kjell Winblad
2019-06-26Add "make test" command for root and application directoriesKjell Winblad
The added make target is described in HOWTO/TESTING.md.
2019-06-24Eliminate dialyzer warningsBjörn Gustavsson
Eliminate the Dialyzer warnings shown when the limits in lib/cerl/erl_types.erl were raised as follows: -define(TUPLE_TAG_LIMIT, 10). -define(TUPLE_ARITY_LIMIT, 10). -define(SET_LIMIT, 64).
2019-06-18Merge branch 'john/compiler/fun-environment-types/OTP-15896'John Högberg
* john/compiler/fun-environment-types/OTP-15896: compiler: Propagate types of free variables
2019-06-18Merge branch 'john/compiler/cuddle-type-representation'John Högberg
* john/compiler/cuddle-type-representation: compiler: Add common method for literal -> type conversion
2019-06-17compiler: Propagate types of free variablesJohn Högberg
2019-06-17Create a shared wrapper function for all occurrences of 'fun F/A'Björn Gustavsson
If the `fun F/A` syntax is used multiple times with the same `F/A`, (for examle, `fun foo/2`), there would a wrapper function and fun entry generated for each occurrence. Using the new support in the OTP 23 runtime system, generate a single wrapper function and fun entry for each `F/A`. Since there is only one wrapper function, it can be named based on the name of the function it calls to faciliate debugging, not based on the function that defines the fun. For example, the wrapper function for `fun foo/0` will now be named `-fun.foo/0-'.
2019-06-14compiler: Add common method for literal -> type conversionJohn Högberg
2019-06-13genop.tab: Insert an "OTP 23" comment for clarityBjörn Gustavsson
2019-06-13Merge branch 'john/compiler/common-type-representation/OTP-15792'John Högberg
* john/compiler/common-type-representation/OTP-15792: beam_validator: Replace old type representation with beam_types beam_validator: Subtract types when inferring type test BIFs beam_call_types: Improve type handling of lists:zip/2 and friends compiler: Move "known functions" to beam_types compiler: Break out SSA/beam type definitions into a separate module beam_ssa_type: Fix meet/join inconsistency beam_ssa_type: Fix 'band' type determination beam_validator: Reduce literals to their types beam_validator: Refactor local call validation beam_validator: Simplify the match context type beam_validator: Use integers as tuple element keys
2019-06-13Merge branch 'maint'John Högberg
* maint: Updated OTP version Prepare release # Conflicts: # OTP_VERSION
2019-06-13Merge branch 'maint-22' into maintJohn Högberg
* maint-22: Updated OTP version Prepare release # Conflicts: # make/otp_version_tickets
2019-06-12beam_validator: Replace old type representation with beam_typesJohn Högberg
2019-06-12Merge pull request #2274 from kostis/cerl-fix-ctypeBjörn Gustavsson
cerl: Fix spelling error in a case of ctype()