Closed
Description
@jhogberg #6624 introduced a bug where various test cases crash erlc in beam_kernel_to_ssa.
The bug is not fixed by #6629.
Sample error message:
Function: f/1
minimized/kernel_to_ssa4.erl: internal error in pass beam_kernel_to_ssa:
exception error: bad key: 5
in function map_get/2
called as map_get(5,
#{0 => {b_var,0},
2 => {b_var,2},
3 => {b_var,3},
'@ssa_bool' => {b_var,'@ssa_bool'},
'@ssa_ret' => {b_var,'@ssa_ret'}})
*** argument 1: not present in map
in call from beam_kernel_to_ssa:ssa_arg/2 (beam_kernel_to_ssa.erl, line 1127)
in call from beam_kernel_to_ssa:'-bif_cg/5-lc$^0/1-0-'/2 (beam_kernel_to_ssa.erl, line 1125)
in call from beam_kernel_to_ssa:bif_cg/5 (beam_kernel_to_ssa.erl, line 1125)
in call from beam_kernel_to_ssa:cg/2 (beam_kernel_to_ssa.erl, line 113)
in call from beam_kernel_to_ssa:cg/2 (beam_kernel_to_ssa.erl, line 114)
in call from beam_kernel_to_ssa:select_val/4 (beam_kernel_to_ssa.erl, line 498)
in call from beam_kernel_to_ssa:'-select_cg/5-anonymous-0-'/4 (beam_kernel_to_ssa.erl, line 217)
Sample testcases:
f(X) ->
case X of
_ ->
not (X orelse ((_ = ok) * <<0 || true>>))
end.
or
f() ->
try ((true = [X | _]) = (ok * (_ = ok))) of
_ ->
X
after
ok
end.
or
f() ->
try
not (case {(_ = ok), (Y = ?MODULE:foo())} of
a ->
ok;
0 ->
ok
end)
of
_ ->
Y
after
ok
end.
or
f(X) ->
{
case ok of
_ ->
([] = a) = fun() ->
X
end
end
}.
I can easily provide a few dozen more testcases for this bug if it helps with debugging.