summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-08-10 15:11:00 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-08-10 15:11:00 +0900
commitdfaff83eba8fbf3953b6ab0e92df41899de2eccc (patch)
treec0913219aee810ccd439e74475ab02af7cca5f4e
parentb34ee9a4b4cf75135ab8c6887068687bbd9f5b06 (diff)
downloadmruby-dfaff83eba8fbf3953b6ab0e92df41899de2eccc.tar.gz
mruby-dfaff83eba8fbf3953b6ab0e92df41899de2eccc.zip
codegen: add peep hole optimization to skip overridden OP_MOVE
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index b128231cf..ba451309e 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -188,6 +188,11 @@ genop_peep(codegen_scope *s, mrb_code i, int val)
if (val) break;
switch (c0) {
case OP_MOVE:
+ if (GETARG_A(i) == GETARG_A(i0)) {
+ /* skip overriden OP_MOVE */
+ s->pc--;
+ return genop_peep(s, i, val);
+ }
if (GETARG_B(i) == GETARG_A(i0) && GETARG_A(i) == GETARG_B(i0)) {
/* skip swapping OP_MOVE */
return 0;