File 3221-Inline-safe-calls-to-maps-put-3.patch of Package erlang
From 39756ebdf76715bd04e861ff48e36c0bbb5598b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Wed, 29 May 2024 08:12:42 +0200
Subject: [PATCH] Inline safe calls to maps:put/3
Using the map syntax instead of `maps:put/3` is slightly more
efficient in itself, but also reduces register shuffling and can open
up for combining multiple adjacent map update operations into a single
update operation.
---
lib/compiler/src/beam_ssa_type.erl | 12 ++++++++
system/doc/efficiency_guide/maps.md | 48 +++++++++++++++++++++++++++--
2 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/lib/compiler/src/beam_ssa_type.erl b/lib/compiler/src/beam_ssa_type.erl
index 9b4db89983..790d4ed364 100644
--- a/lib/compiler/src/beam_ssa_type.erl
+++ b/lib/compiler/src/beam_ssa_type.erl
@@ -1497,6 +1497,8 @@ will_succeed_1(#b_set{op=has_map_field}, _Src, _Ts) ->
yes;
will_succeed_1(#b_set{op=get_tuple_element}, _Src, _Ts) ->
yes;
+will_succeed_1(#b_set{op=put_map,args=[#b_literal{val=assoc}|_]}, _Src, _Ts) ->
+ yes;
will_succeed_1(#b_set{op=update_tuple,args=[Tuple | Updates]}, _Src, Ts) ->
TupleType = concrete_type(Tuple, Ts),
HighestIndex = update_tuple_highest_index(Updates, -1),
@@ -1671,6 +1673,16 @@ simplify_remote_call(erlang, throw, [Term], Ts, I) ->
beam_ssa:add_anno(thrown_type, Type, I);
simplify_remote_call(erlang, '++', [#b_literal{val=[]},Tl], _Ts, _I) ->
Tl;
+simplify_remote_call(maps=Mod, put=Name, [Key,Val,Map], Ts, I) ->
+ case concrete_type(Map, Ts) of
+ #t_map{} ->
+ %% This call to maps:put/3 cannot fail. Replace with the
+ %% slightly more efficient `put_map` instruction.
+ Args = [#b_literal{val=assoc},Map,Key,Val],
+ I#b_set{op=put_map,args=Args};
+ _ ->
+ simplify_pure_call(Mod, Name, [Key,Val,Map], I)
+ end;
simplify_remote_call(Mod, Name, Args, _Ts, I) ->
case erl_bifs:is_pure(Mod, Name, length(Args)) of
true ->
--
2.35.3