[erlang-patches] Use a set to store ref registers in beam_receive

Fredrik fredrik@REDACTED
Wed Apr 10 10:02:05 CEST 2013


On 04/10/2013 12:19 AM, Anthony Ramine wrote:
> Hello,
>
> In some circumstances, as when inlining code, when some optimization passes are disabled or with hand-written but semantically correct Core Erlang or BEAM assembly, a fresh reference may be live in more than one register:
>
>          ...
>          {allocate_zero,2,2}.
>          ...
>          {call_ext,0,{extfunc,erlang,make_ref,0}}. % Ref in [x0]
>          ...
>          {move,{x,0},{y,0}}. % Ref in [x0,y0]
>          {move,{y,1},{x,0}}. % Ref in [y0]
>          ...
>          {move,{y,0},{x,0}}. % Ref in [x0,y0]
>          {move,{x,0},{y,1}}. % Ref in [x0,y0,y1]
>        {label,5}.
>          {loop_rec,{f,6},{x,0}}. % Ref in [y0,y1]
>          ...
>          {loop_rec_end,{f,5}}.
>        {label,6}.
>          {wait,{f,5}}.
>          ...
>
> Pass beam_receive expects a single live register for the ref when it encounters the loop_rec instruction and crashes with the following reason:
>
>      $ erlc t.S
>      ...
>      crash reason: {{case_clause,
>                         {'EXIT',
>                             {{case_clause,[{y,1},{y,0}]},
>                              [{beam_receive,opt_recv,5,
>                                   [{file,"beam_receive.erl"},{line,154}]},
>                               ...]}}},
>                     ...}
>
> This patch teaches beam_receive how to use a set of registers instead of a single one when tracking fresh references, thus avoiding the crash.
>
> 	git fetch https://github.com/nox/otp.git fix-multiple-ref-regs
>
> 	https://github.com/nox/otp/compare/erlang:maint...fix-multiple-ref-regs
> 	https://github.com/nox/otp/compare/erlang:maint...fix-multiple-ref-regs.patch
>
> This is yet again something that I encountered while working on the file optimization branch file-receive-optim:
>
> 	https://gist.github.com/nox/2e33fe9a85e035caadda#file-t-codegen
>
> Regards,
>
Hello Anthony,
Fetched your branch. Currently in the review state and in 'pu' branch.

-- 

BR Fredrik Gustafsson
Erlang OTP Team




More information about the erlang-patches mailing list