Age | Commit message (Collapse) | Author | |
---|---|---|---|
2016-03-15 | update copyright-year | Henrik Nord | |
2015-06-18 | Change license text to APLv2 | Bruce Yinhe | |
2013-04-19 | Use a set to store ref registers in beam_receive | Anthony Ramine | |
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 commit teaches beam_receive how to use a set of registers instead of a single one when tracking fresh references, thus avoiding the crash. | |||
2013-02-06 | beam_receive: Eliminate dialyzer warning for unmatched return | Björn Gustavsson | |
2013-01-25 | Update copyright years | Björn-Egil Dahlberg | |
2012-10-10 | Represent the 'send' instruction as a call_ext/2 instruction | Björn Gustavsson | |
Somewhat reduce code bloat. | |||
2012-10-10 | Rewrite select_val and select_tuple_arity to a select instruction | Björn Gustavsson | |
Eliminate some code bloat. | |||
2012-10-09 | beam_receive: Optimize receives using refs created by spawn_monitor/{1,3} | Björn Gustavsson | |
2011-12-09 | Update copyright years | Björn-Egil Dahlberg | |
2011-08-16 | compiler: Generate line instructions | Björn Gustavsson | |
2010-05-11 | Optimize selective receives in the presence of a large message queue | Björn Gustavsson | |
If a gen_server process has many messages in its message queue and calls another gen_server process, the selective receive in gen_server:call() will have to go through the entire message queue. Have the compiler generate the new mark_recv/1 and mark_recv/1 instructions that can avoid going through the entire message queue. |