File 2330-Optimize-encoding-of-simple-literals.patch of Package erlang

From 6a9ed8508d4025c68b90aab44679551655967908 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Sun, 14 Apr 2019 09:07:40 +0200
Subject: [PATCH] Optimize encoding of simple literals

`beam_asm` would encode `{literal,[]}`, `{literal,erlang}`, and
`{literal,42}` in a less efficient way than the equivalent values
`nil`, `{atom,erlang}`, and `{integer,42}`. That would increase the
size of BEAM files and could increase the loaded code size. It would
probably not harm performance, because `literal` was only used this
way in code that generates `badmatch` and `case_clause` exceptions.
---
 lib/compiler/src/beam_asm.erl | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/lib/compiler/src/beam_asm.erl b/lib/compiler/src/beam_asm.erl
index bc1290f6fd..df09dcb06c 100644
--- a/lib/compiler/src/beam_asm.erl
+++ b/lib/compiler/src/beam_asm.erl
@@ -407,14 +407,14 @@ encode_arg({atom, Atom}, Dict0) when is_atom(Atom) ->
     {Index, Dict} = beam_dict:atom(Atom, Dict0),
     {encode(?tag_a, Index), Dict};
 encode_arg({integer, N}, Dict) ->
-    %% Conservatily assume that all integers whose absolute
+    %% Conservatively assume that all integers whose absolute
     %% value is greater than 1 bsl 128 will be bignums in
     %% the runtime system.
     if
         N >= 1 bsl 128 ->
-            encode_arg({literal, N}, Dict);
+            encode_literal(N, Dict);
         N =< -(1 bsl 128) ->
-            encode_arg({literal, N}, Dict);
+            encode_literal(N, Dict);
         true ->
             {encode(?tag_i, N), Dict}
     end;
@@ -434,7 +434,7 @@ encode_arg({list, List}, Dict0) ->
     {L, Dict} = encode_list(List, Dict0, []),
     {[encode(?tag_z, 1), encode(?tag_u, length(List))|L], Dict};
 encode_arg({float, Float}, Dict) when is_float(Float) ->
-    encode_arg({literal,Float}, Dict);
+    encode_literal(Float, Dict);
 encode_arg({fr,Fr}, Dict) ->
     {[encode(?tag_z, 2),encode(?tag_u, Fr)], Dict};
 encode_arg({field_flags,Flags0}, Dict) ->
@@ -442,12 +442,24 @@ encode_arg({field_flags,Flags0}, Dict) ->
     {encode(?tag_u, Flags), Dict};
 encode_arg({alloc,List}, Dict) ->
     encode_alloc_list(List, Dict);
-encode_arg({literal,Lit}, Dict0) ->
-    {Index,Dict} = beam_dict:literal(Lit, Dict0),
-    {[encode(?tag_z, 4),encode(?tag_u, Index)],Dict};
+encode_arg({literal,Lit}, Dict) ->
+    if
+        Lit =:= [] ->
+            encode_arg(nil, Dict);
+        is_atom(Lit) ->
+            encode_arg({atom,Lit}, Dict);
+        is_integer(Lit) ->
+            encode_arg({integer,Lit}, Dict);
+        true ->
+            encode_literal(Lit, Dict)
+    end;
 encode_arg(Int, Dict) when is_integer(Int) ->
     {encode(?tag_u, Int),Dict}.
 
+encode_literal(Literal, Dict0) ->
+    {Index,Dict} = beam_dict:literal(Literal, Dict0),
+    {[encode(?tag_z, 4),encode(?tag_u, Index)],Dict}.
+
 %%flag_to_bit(aligned) -> 16#01; %% No longer useful.
 flag_to_bit(little)  -> 16#02;
 flag_to_bit(big)     -> 16#00;
-- 
2.16.4

openSUSE Build Service is sponsored by