1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

compile.c: adjust call_info count

* compile.c (remove_unreachable_chunk): decrease count of
  call_info in removed instructions.  fix up r53402.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53403 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-01-01 06:28:58 +00:00
parent 0094737575
commit 910eb9836d
2 changed files with 29 additions and 17 deletions

View file

@ -1,3 +1,8 @@
Fri Jan 1 15:28:56 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* compile.c (remove_unreachable_chunk): decrease count of
call_info in removed instructions. fix up r53402.
Fri Jan 1 12:05:53 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Jan 1 12:05:53 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* compile.c (remove_unreachable_chunk): remove unreferred label * compile.c (remove_unreachable_chunk): remove unreferred label

View file

@ -1933,9 +1933,9 @@ get_prev_insn(INSN *iobj)
} }
static void static void
unref_destination(INSN *iobj) unref_destination(INSN *iobj, int pos)
{ {
LABEL *lobj = (LABEL *)OPERAND_AT(iobj, 0); LABEL *lobj = (LABEL *)OPERAND_AT(iobj, pos);
--lobj->refcnt; --lobj->refcnt;
if (!lobj->refcnt) REMOVE_ELEM(&lobj->link); if (!lobj->refcnt) REMOVE_ELEM(&lobj->link);
} }
@ -1953,19 +1953,26 @@ replace_destination(INSN *dobj, INSN *nobj)
} }
static int static int
remove_unreachable_chunk(LINK_ELEMENT *i) remove_unreachable_chunk(rb_iseq_t *iseq, LINK_ELEMENT *i)
{ {
int removed = 0; int removed = 0;
while (i) { while (i) {
if (i->type == ISEQ_ELEMENT_INSN) { if (i->type == ISEQ_ELEMENT_INSN) {
switch (INSN_OF(i)) { struct rb_iseq_constant_body *body = iseq->body;
case BIN(jump): VALUE insn = INSN_OF(i);
case BIN(branchif): int pos, len = insn_len(insn);
case BIN(branchunless): for (pos = 0; pos < len; ++pos) {
case BIN(branchnil): switch (insn_op_types(insn)[pos]) {
unref_destination((INSN *)i); case TS_OFFSET:
default: unref_destination((INSN *)i, pos);
break; break;
case TS_CALLINFO:
if (((struct rb_call_info *)OPERAND_AT(i, pos))->flag & VM_CALL_KWARG)
--(body->ci_kw_size);
else
--(body->ci_size);
break;
}
} }
} }
else if (i->type == ISEQ_ELEMENT_LABEL) { else if (i->type == ISEQ_ELEMENT_LABEL) {
@ -2006,13 +2013,13 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
* => * =>
* LABEL: * LABEL:
*/ */
unref_destination(iobj); unref_destination(iobj, 0);
REMOVE_ELEM(&iobj->link); REMOVE_ELEM(&iobj->link);
} }
else if (iobj != diobj && diobj->insn_id == BIN(jump) && else if (iobj != diobj && diobj->insn_id == BIN(jump) &&
OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) { OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) {
replace_destination(iobj, diobj); replace_destination(iobj, diobj);
remove_unreachable_chunk(iobj->link.next); remove_unreachable_chunk(iseq, iobj->link.next);
goto again; goto again;
} }
else if (diobj->insn_id == BIN(leave)) { else if (diobj->insn_id == BIN(leave)) {
@ -2032,7 +2039,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
INSN *popiobj = new_insn_core(iseq, iobj->line_no, INSN *popiobj = new_insn_core(iseq, iobj->line_no,
BIN(pop), 0, 0); BIN(pop), 0, 0);
/* replace */ /* replace */
unref_destination(iobj); unref_destination(iobj, 0);
REPLACE_ELEM((LINK_ELEMENT *)iobj, (LINK_ELEMENT *)eiobj); REPLACE_ELEM((LINK_ELEMENT *)iobj, (LINK_ELEMENT *)eiobj);
INSERT_ELEM_NEXT((LINK_ELEMENT *)eiobj, (LINK_ELEMENT *)popiobj); INSERT_ELEM_NEXT((LINK_ELEMENT *)eiobj, (LINK_ELEMENT *)popiobj);
iobj = eiobj; iobj = eiobj;
@ -2062,13 +2069,13 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
REMOVE_ELEM(&iobj->link); REMOVE_ELEM(&iobj->link);
} }
} }
else if (remove_unreachable_chunk(iobj->link.next)) { else if (remove_unreachable_chunk(iseq, iobj->link.next)) {
goto again; goto again;
} }
} }
if (iobj->insn_id == BIN(leave)) { if (iobj->insn_id == BIN(leave)) {
remove_unreachable_chunk(iobj->link.next); remove_unreachable_chunk(iseq, iobj->link.next);
} }
if (iobj->insn_id == BIN(branchif) || if (iobj->insn_id == BIN(branchif) ||
@ -2166,7 +2173,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
goto again; goto again;
} }
else { else {
unref_destination(iobj); unref_destination(iobj, 0);
REMOVE_ELEM(&iobj->link); REMOVE_ELEM(&iobj->link);
} }
break; break;