diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-18 02:32:17 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-18 02:32:17 +0000 |
commit | 44a5f70f06936394b14d2e3044693b43b9d3fb3c (patch) | |
tree | 59cef8c39af71bf62fea6bbc91d6c604d1506127 | |
parent | b1e70025aa1232ff1a9dcddbdfebd5bbb1c8657a (diff) | |
download | ruby-44a5f70f06936394b14d2e3044693b43b9d3fb3c.tar.gz |
compile.c: optimize useless branches
* compile.c (iseq_peephole_optimize): eliminate always/never
branches after a literal object. this sequence typically
appears by defined? operator for a method call on a local
variable.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | compile.c | 27 |
2 files changed, 34 insertions, 0 deletions
@@ -1,3 +1,10 @@ +Wed Nov 18 11:32:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * compile.c (iseq_peephole_optimize): eliminate always/never + branches after a literal object. this sequence typically + appears by defined? operator for a method call on a local + variable. + Wed Nov 18 10:33:06 2015 NAKAMURA Usaku <usa@ruby-lang.org> * ext/socket/ancdata.c (bsock_recvmsg_internal): stretch the buffer size @@ -2031,6 +2031,33 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal */ replace_destination(iobj, nobj); } + else if (pobj) { + int cond; + if (pobj->insn_id == BIN(putobject)) { + cond = (iobj->insn_id == BIN(branchif) ? + OPERAND_AT(pobj, 0) != Qfalse : + iobj->insn_id == BIN(branchunless) ? + OPERAND_AT(pobj, 0) == Qfalse : + FALSE); + } + else if (pobj->insn_id == BIN(putstring)) { + cond = iobj->insn_id == BIN(branchif); + } + else if (pobj->insn_id == BIN(putnil)) { + cond = iobj->insn_id != BIN(branchif); + } + else break; + REMOVE_ELEM(&pobj->link); + if (cond) { + iobj->insn_id = BIN(jump); + goto again; + } + else { + unref_destination(iobj); + REMOVE_ELEM(&iobj->link); + } + break; + } else break; nobj = (INSN *)get_destination_insn(nobj); } |