diff options
author | Björn Gustavsson <[email protected]> | 2019-06-27 12:56:06 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-06-27 12:56:06 +0200 |
commit | a60e5433f7115d7ef245638767c723f1c336a9e6 (patch) | |
tree | e8402fd5201e317a088de9da560e42495edae1a5 /lib/compiler/src | |
parent | 1d13a0006a4211f3a8f1c48c0333194fc2a9cca5 (diff) | |
parent | 4be7ac22d77680cf36302b3d6f37c5fe4cac7f2a (diff) | |
download | otp-a60e5433f7115d7ef245638767c723f1c336a9e6.tar.gz otp-a60e5433f7115d7ef245638767c723f1c336a9e6.tar.bz2 otp-a60e5433f7115d7ef245638767c723f1c336a9e6.zip |
Merge branch 'maint'
* maint:
Fix slow compilation of huge functions
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_ssa.erl | 20 |
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) -> |