summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-07-28 11:23:29 +0900
committerYukihiro Matsumoto <[email protected]>2012-07-28 11:23:29 +0900
commit7f8076ef90be326d7a199baad32d0a84ebbec6d3 (patch)
treee74dc35fa8aacb9a2a37ede5ecbb0b8f19604df4
parent88043c5ccd198b60b54b97d103d3f420c698c882 (diff)
downloadmruby-7f8076ef90be326d7a199baad32d0a84ebbec6d3.tar.gz
mruby-7f8076ef90be326d7a199baad32d0a84ebbec6d3.zip
more peephole optimization on OP_MOVE
-rw-r--r--src/codegen.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/codegen.c b/src/codegen.c
index e032ec509..3bf0e496c 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -145,7 +145,7 @@ genop(codegen_scope *s, mrb_code i)
static void
genop_peep(codegen_scope *s, mrb_code i, int val)
{
- // peephole optimization
+ /* peephole optimization */
if (!val && s->lastlabel != s->pc && s->pc > 0) {
mrb_code i0 = s->iseq[s->pc-1];
int c1 = GET_OPCODE(i);
@@ -156,9 +156,13 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
switch (c0) {
case OP_MOVE:
if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0) && GETARG_A(i) >= s->nlocals) {
- // skip swapping OP_MOVE
+ /* skip swapping OP_MOVE */
return;
}
+ if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {
+ s->iseq[s->pc-1] = MKOP_AB(OP_MOVE, GETARG_A(i), GETARG_B(i0));
+ return;
+ }
break;
case OP_LOADI:
if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i0) >= s->nlocals) {