aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-06-27 12:56:06 +0200
committerBjörn Gustavsson <[email protected]>2019-06-27 12:56:06 +0200
commita60e5433f7115d7ef245638767c723f1c336a9e6 (patch)
treee8402fd5201e317a088de9da560e42495edae1a5 /lib
parent1d13a0006a4211f3a8f1c48c0333194fc2a9cca5 (diff)
parent4be7ac22d77680cf36302b3d6f37c5fe4cac7f2a (diff)
downloadotp-a60e5433f7115d7ef245638767c723f1c336a9e6.tar.gz
otp-a60e5433f7115d7ef245638767c723f1c336a9e6.tar.bz2
otp-a60e5433f7115d7ef245638767c723f1c336a9e6.zip
Merge branch 'maint'
* maint: Fix slow compilation of huge functions
Diffstat (limited to 'lib')
-rw-r--r--lib/compiler/src/beam_ssa.erl20
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/compiler/src/beam_ssa.erl b/lib/compiler/src/beam_ssa.erl
index 25e6bfb009..7a766623b0 100644
--- a/lib/compiler/src/beam_ssa.erl
+++ b/lib/compiler/src/beam_ssa.erl
@@ -124,7 +124,7 @@
'put_tuple_element' | 'put_tuple_elements' |
'set_tuple_element'.
--import(lists, [foldl/3,keyfind/3,mapfoldl/3,member/2,reverse/1]).
+-import(lists, [foldl/3,keyfind/3,mapfoldl/3,member/2,reverse/1,umerge/1]).
-spec add_anno(Key, Value, Construct) -> Construct when
Key :: atom(),
@@ -652,12 +652,18 @@ is_commutative('=/=') -> true;
is_commutative('/=') -> true;
is_commutative(_) -> false.
-def_used_1([#b_blk{is=Is,last=Last}|Bs], Preds, Def0, Used0) ->
- {Def,Used1} = def_used_is(Is, Preds, Def0, Used0),
- Used = ordsets:union(used(Last), Used1),
- def_used_1(Bs, Preds, Def, Used);
-def_used_1([], _Preds, Def, Used) ->
- {ordsets:from_list(Def),Used}.
+def_used_1([#b_blk{is=Is,last=Last}|Bs], Preds, Def0, UsedAcc) ->
+ {Def,Used} = def_used_is(Is, Preds, Def0, used(Last)),
+ case Used of
+ [] ->
+ def_used_1(Bs, Preds, Def, UsedAcc);
+ [_|_] ->
+ def_used_1(Bs, Preds, Def, [Used|UsedAcc])
+ end;
+def_used_1([], _Preds, Def0, UsedAcc) ->
+ Def = ordsets:from_list(Def0),
+ Used = umerge(UsedAcc),
+ {Def,Used}.
def_used_is([#b_set{op=phi,dst=Dst,args=Args}|Is],
Preds, Def0, Used0) ->