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:
parent
0094737575
commit
910eb9836d
2 changed files with 29 additions and 17 deletions
|
@ -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
|
||||||
|
|
39
compile.c
39
compile.c
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue