aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-03-28 13:23:08 +0100
committerBjörn Gustavsson <[email protected]>2019-03-28 13:23:08 +0100
commit2f879097241d289e0100c7d1725485e2276a7f70 (patch)
treedd4e273144307652a1f20445ce6a4648a3cd145a /lib/compiler/src
parent6258b1087db31919cfa3b34a45d99a14914a2fc6 (diff)
parent483c5c4a9860ce4866b3c4f4f545bbfa55e2e14d (diff)
downloadotp-2f879097241d289e0100c7d1725485e2276a7f70.tar.gz
otp-2f879097241d289e0100c7d1725485e2276a7f70.tar.bz2
otp-2f879097241d289e0100c7d1725485e2276a7f70.zip
Merge branch 'bjorn/compiler/cuddle-with-tests'
* bjorn/compiler/cuddle-with-tests: Verify the highest opcode for the r21 test suites Add test_lib:highest_opcode/1 sys_core_fold: Simplify case_expand_var/2 beam_validator: Remove uncovered lines in lists_mod_return_type/3 Cover return type determination of lists functions
Diffstat (limited to 'lib/compiler/src')
-rw-r--r--lib/compiler/src/beam_validator.erl10
-rw-r--r--lib/compiler/src/sys_core_fold.erl45
2 files changed, 7 insertions, 48 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index 4fba3fa1c6..efd2be94cb 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -2899,8 +2899,6 @@ lists_mod_return_type(filter, 2, _Vst) ->
list;
lists_mod_return_type(flatten, 1, _Vst) ->
list;
-lists_mod_return_type(flatten, 2, _Vst) ->
- list;
lists_mod_return_type(map, 2, Vst) ->
same_length_type({x,1}, Vst);
lists_mod_return_type(MF, 3, Vst) when MF =:= mapfoldl; MF =:= mapfoldr ->
@@ -2912,8 +2910,6 @@ lists_mod_return_type(reverse, 1, Vst) ->
same_length_type({x,0}, Vst);
lists_mod_return_type(seq, 2, _Vst) ->
list;
-lists_mod_return_type(seq, 3, _Vst) ->
- list;
lists_mod_return_type(sort, 1, Vst) ->
same_length_type({x,0}, Vst);
lists_mod_return_type(sort, 2, Vst) ->
@@ -2927,16 +2923,10 @@ lists_mod_return_type(unzip, 1, Vst) ->
two_tuple(ListType, ListType);
lists_mod_return_type(usort, 1, Vst) ->
same_length_type({x,0}, Vst);
-lists_mod_return_type(usort, 2, Vst) ->
- same_length_type({x,1}, Vst);
lists_mod_return_type(zip, 2, _Vst) ->
list;
-lists_mod_return_type(zip3, 3, _Vst) ->
- list;
lists_mod_return_type(zipwith, 3, _Vst) ->
list;
-lists_mod_return_type(zipwith3, 4, _Vst) ->
- list;
lists_mod_return_type(_, _, _) ->
term.
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index 7e219da0af..4939a94a92 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -1997,53 +1997,22 @@ case_opt_compiler_generated(Core) ->
%% case_expand_var(Expr0, Sub) -> Expr
-%% If Expr0 is a variable that has been previously matched and
-%% is known to be a tuple, return the tuple instead. Otherwise
+%% If Expr0 is a variable that is known to be bound to a
+%% constructed tuple, return the tuple instead. Otherwise
%% return Expr0 unchanged.
-%%
+
case_expand_var(E, #sub{t=Tdb}) ->
Key = cerl:var_name(E),
case Tdb of
- #{Key:=T0} ->
- case cerl:is_c_tuple(T0) of
- false ->
- E;
- true ->
- %% The pattern was a tuple. Now we must make sure
- %% that the elements of the tuple are suitable. In
- %% particular, we don't want binary or map
- %% construction here, since that means that the
- %% binary or map will be constructed in the 'case'
- %% argument. That is wasteful for binaries. Even
- %% worse is that any map pattern that use the ':='
- %% operator will fail when used in map
- %% construction (only the '=>' operator is allowed
- %% when constructing a map from scratch).
- try
- cerl_trees:map(fun coerce_to_data/1, T0)
- catch
- throw:impossible ->
- %% Something unsuitable was found (map or
- %% or binary). Keep the variable.
- E
- end
+ #{Key:=T} ->
+ case cerl:is_c_tuple(T) of
+ false -> E;
+ true -> T
end;
_ ->
E
end.
-%% coerce_to_data(Core) -> Core'
-%% Coerce an element originally from a pattern to an data item or or
-%% variable. Throw an 'impossible' exception if non-data Core Erlang
-%% terms such as binary construction or map construction are
-%% encountered.
-
-coerce_to_data(C) ->
- case cerl:is_data(C) orelse cerl:is_c_var(C) of
- true -> C;
- false -> throw(impossible)
- end.
-
%% case_opt_nomatch(E, Clauses, LitExpr) -> Clauses'
%% Remove all clauses that cannot possibly match.