From 207436c383995dc6fcea1953f9188f8df280bd81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Wed, 15 Jun 2011 08:03:25 +0200 Subject: Combine a 'call' instruction with the following 'end' instruction A 'call' instruction in the loader transformation language is always followed by an 'end' instruction, so we can replace the 'call' instruction with a 'call_end' instruction. --- erts/emulator/beam/beam_load.c | 6 +++--- erts/emulator/utils/beam_makeops | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c index 4da411be1f..0d639572e0 100644 --- a/erts/emulator/beam/beam_load.c +++ b/erts/emulator/beam/beam_load.c @@ -4458,8 +4458,8 @@ transform_engine(LoaderState* st) #endif break; -#if defined(TOP_call) - case TOP_call: +#if defined(TOP_call_end) + case TOP_call_end: { GenOp** lastp; GenOp* new_instr; @@ -4496,7 +4496,7 @@ transform_engine(LoaderState* st) *lastp = st->genop; st->genop = new_instr; } - break; + RETURN(TE_OK); #endif case TOP_new_instr: /* diff --git a/erts/emulator/utils/beam_makeops b/erts/emulator/utils/beam_makeops index 7b66496856..2272a941bb 100755 --- a/erts/emulator/utils/beam_makeops +++ b/erts/emulator/utils/beam_makeops @@ -1591,7 +1591,7 @@ sub tr_gen_to { } } pop(@code); # Get rid of 'next_instr' - push(@code, &make_op("$name()", 'call', scalar(@call_table))); + push(@code, make_op("$name()", 'call_end', scalar(@call_table))); push(@call_table, [$name, @args]); last; } @@ -1629,7 +1629,8 @@ sub tr_gen_to { pop(@code) if is_instr($code[$#code], 'next_arg'); } - push(@code, &make_op('', 'end')); + push(@code, make_op('', 'end')) + unless is_instr($code[$#code], 'call_end'); # # Chain together all codes segments having the same first operation. -- cgit v1.2.3