Skip to content

[erlc] newly introduced internal error in pass beam_kernel_to_ssa #6630

Closed
@RobinMorisset

Description

@RobinMorisset

@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.

Metadata

Metadata

Assignees

Labels

bugIssue is reported as a bugteam:VMAssigned to OTP team VM

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions