summaryrefslogtreecommitdiff
path: root/lib/compiler/src
diff options
context:
space:
mode:
authorJohn Högberg <john@erlang.org>2023-03-16 11:05:50 +0100
committerJohn Högberg <john@erlang.org>2023-03-16 11:05:50 +0100
commit95df74247e0ed21f64e111ba60c2ed42e6e64f32 (patch)
tree95903f2e401ad57a4cc574f67b1fa547c7f88d24 /lib/compiler/src
parentd59e9c2e9ca6b513404fbce08dd2aad4470871cf (diff)
parent2e444a4b52512d607c4098964090655cfae49602 (diff)
downloaderlang-95df74247e0ed21f64e111ba60c2ed42e6e64f32.tar.gz
Merge branch 'john/compiler/inline-maps-get-3/OTP-18502'
* john/compiler/inline-maps-get-3/OTP-18502: sys_core_fold: Fix rewriting complex dynamic keys on maps:get/3
Diffstat (limited to 'lib/compiler/src')
-rw-r--r--lib/compiler/src/sys_core_fold.erl10
1 files changed, 6 insertions, 4 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index 4d2e618821..024b2d5f2a 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -808,8 +808,8 @@ call(#c_call{args=As0}=Call0, #c_literal{val=M}=M0, #c_literal{val=N}=N0, Sub) -
Core -> expr(Core, Sub)
end
end;
- #c_case{}=Case ->
- Case;
+ #c_let{}=Let ->
+ Let;
#c_literal{}=Lit ->
Lit
end;
@@ -821,9 +821,10 @@ call(#c_call{args=As0}=Call, M, N, Sub) ->
%% slightly at the cost of making tracing and stack traces incorrect.
simplify_call(Call, maps, get, [Key, Map]) ->
rewrite_call(Call, erlang, map_get, [Key, Map]);
-simplify_call(#c_call{anno=Anno0}, maps, get, [Key, Map, Default]) ->
+simplify_call(#c_call{anno=Anno0}, maps, get, [Key0, Map, Default]) ->
Anno = [compiler_generated | Anno0],
+ Key = make_var(Anno),
Value = make_var(Anno),
Fail = make_var(Anno),
Raise = #c_primop{name=#c_literal{val=match_fail},
@@ -845,7 +846,8 @@ simplify_call(#c_call{anno=Anno0}, maps, get, [Key, Map, Default]) ->
pats=[Fail],
guard=#c_literal{val=true},
body=Raise}],
- #c_case{anno=Anno,arg=Map,clauses=Cs};
+
+ cerl:ann_c_let(Anno, [Key], Key0, #c_case{anno=Anno,arg=Map,clauses=Cs});
simplify_call(Call, maps, is_key, [Key, Map]) ->
rewrite_call(Call, erlang, is_map_key, [Key, Map]);
simplify_call(_Call, maps, new, []) ->