aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/ops.tab
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2019-03-18 07:00:56 +0100
committerBjörn Gustavsson <[email protected]>2019-03-19 16:02:00 +0100
commit5836998a956966a5ecc6dddfc4f8b73fc3aa6f1e (patch)
treea5dc614d787d2f00239394baed2909ac56c356bb /erts/emulator/beam/ops.tab
parentf5ad8d333947da10fa712db4a579b838d00ad485 (diff)
downloadotp-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.tab17
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