diff options
author | Björn Gustavsson <[email protected]> | 2019-03-18 07:00:56 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-03-19 16:02:00 +0100 |
commit | 5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e (patch) | |
tree | a5dc614d787d2f00239394baed2909ac56c356bb /erts/emulator/beam/ops.tab | |
parent | f5ad8d333947da10fa712db4a579b838d00ad485 (diff) | |
download | otp-5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e.tar.gz otp-5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e.tar.bz2 otp-5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e.zip |
Optimize funs converted to literals
Diffstat (limited to 'erts/emulator/beam/ops.tab')
-rw-r--r-- | erts/emulator/beam/ops.tab | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/erts/emulator/beam/ops.tab b/erts/emulator/beam/ops.tab index 46afeb51c9..485703101f 100644 --- a/erts/emulator/beam/ops.tab +++ b/erts/emulator/beam/ops.tab @@ -1148,8 +1148,25 @@ call_fun Arity => i_call_fun Arity i_call_fun t i_call_fun_last t Q + +# +# A fun with an empty environment can be converted to a literal. +# As a further optimization, the we try to move the fun to its +# final destination directly. + make_fun2 OldIndex=u => gen_make_fun2(OldIndex) +move_fun/2 +move_fun Fun X0 | move X0 Dst | move Src X0 => move Fun Dst | move Src X0 +move_fun Fun X0 | move A B | move X0 Dst | move Src X0 | \ + independent_moves(Fun, X0, A, B) | distinct(Dst, A) => \ + move Fun Dst | move A B | move Src X0 +move_fun Fun X0 | move X0 Dst | make_fun2 OldIndex | \ + is_killed_by_make_fun(X0, OldIndex)=> \ + move Fun Dst | make_fun2 OldIndex + +move_fun Fun Dst => move Fun Dst + %cold i_make_fun W t %hot |