From d1932bb73e7d567ffc8389970b46f191f1618448 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 23 Apr 2016 11:43:52 +0000 Subject: compile.c: instruction ID predicate * compile.c (IS_INSN_ID): add instruction ID predicate macro. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54731 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- compile.c | 61 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/compile.c b/compile.c index 9a6519ffd0..3cc7696fda 100644 --- a/compile.c +++ b/compile.c @@ -314,6 +314,7 @@ r_value(VALUE value) #define IS_INSN(link) ((link)->type == ISEQ_ELEMENT_INSN) #define IS_LABEL(link) ((link)->type == ISEQ_ELEMENT_LABEL) #define IS_ADJUST(link) ((link)->type == ISEQ_ELEMENT_ADJUST) +#define IS_INSN_ID(iobj, insn) (INSN_OF(iobj) == BIN(insn)) /* error */ typedef void (*compile_error_func)(rb_iseq_t *, int, const char *, ...); @@ -2022,7 +2023,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal { INSN *iobj = (INSN *)list; again: - if (iobj->insn_id == BIN(jump)) { + if (IS_INSN_ID(iobj, jump)) { INSN *niobj, *diobj, *piobj; /* * useless jump elimination: @@ -2047,13 +2048,13 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal unref_destination(iobj, 0); REMOVE_ELEM(&iobj->link); } - else if (iobj != diobj && diobj->insn_id == BIN(jump) && + else if (iobj != diobj && IS_INSN_ID(diobj, jump) && OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) { replace_destination(iobj, diobj); remove_unreachable_chunk(iseq, iobj->link.next); goto again; } - else if (diobj->insn_id == BIN(leave)) { + else if (IS_INSN_ID(diobj, leave)) { /* * jump LABEL * ... @@ -2089,10 +2090,10 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal * L2: */ else if ((piobj = (INSN *)get_prev_insn(iobj)) != 0 && - (piobj->insn_id == BIN(branchif) || - piobj->insn_id == BIN(branchunless))) { + (IS_INSN_ID(piobj, branchif) || + IS_INSN_ID(piobj, branchunless))) { if (niobj == (INSN *)get_destination_insn(piobj)) { - piobj->insn_id = (piobj->insn_id == BIN(branchif)) + piobj->insn_id = (IS_INSN_ID(piobj, branchif)) ? BIN(branchunless) : BIN(branchif); replace_destination(piobj, iobj); REMOVE_ELEM(&iobj->link); @@ -2103,13 +2104,13 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } } - if (iobj->insn_id == BIN(leave)) { + if (IS_INSN_ID(iobj, leave)) { remove_unreachable_chunk(iseq, iobj->link.next); } - if (iobj->insn_id == BIN(branchif) || - iobj->insn_id == BIN(branchnil) || - iobj->insn_id == BIN(branchunless)) { + if (IS_INSN_ID(iobj, branchif) || + IS_INSN_ID(iobj, branchnil) || + IS_INSN_ID(iobj, branchunless)) { /* * if L1 * ... @@ -2124,15 +2125,15 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal if (pobj) { if (!IS_INSN(&pobj->link)) pobj = 0; - else if (pobj->insn_id == BIN(dup)) + else if (IS_INSN_ID(pobj, dup)) prev_dup = 1; } for (;;) { - if (nobj->insn_id == BIN(jump)) { + if (IS_INSN_ID(nobj, jump)) { replace_destination(iobj, nobj); } - else if (prev_dup && nobj->insn_id == BIN(dup) && + else if (prev_dup && IS_INSN_ID(nobj, dup) && !!(nobj = (INSN *)nobj->link.next) && /* basic blocks, with no labels in the middle */ nobj->insn_id == iobj->insn_id) { @@ -2182,18 +2183,18 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal if (prev_dup && IS_INSN(pobj->link.prev)) { pobj = (INSN *)pobj->link.prev; } - if (pobj->insn_id == BIN(putobject)) { - cond = (iobj->insn_id == BIN(branchif) ? + if (IS_INSN_ID(pobj, putobject)) { + cond = (IS_INSN_ID(iobj, branchif) ? OPERAND_AT(pobj, 0) != Qfalse : - iobj->insn_id == BIN(branchunless) ? + IS_INSN_ID(iobj, branchunless) ? OPERAND_AT(pobj, 0) == Qfalse : FALSE); } - else if (pobj->insn_id == BIN(putstring)) { - cond = iobj->insn_id == BIN(branchif); + else if (IS_INSN_ID(pobj, putstring)) { + cond = IS_INSN_ID(iobj, branchif); } - else if (pobj->insn_id == BIN(putnil)) { - cond = iobj->insn_id != BIN(branchif); + else if (IS_INSN_ID(pobj, putnil)) { + cond = !IS_INSN_ID(iobj, branchif); } else break; REMOVE_ELEM(iobj->link.prev); @@ -2212,7 +2213,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } } - if (iobj->insn_id == BIN(pop)) { + if (IS_INSN_ID(iobj, pop)) { /* * putself / putnil / putobject obj / putstring "..." * pop @@ -2233,10 +2234,10 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal } if (do_tailcallopt && - (iobj->insn_id == BIN(send) || - iobj->insn_id == BIN(opt_aref_with) || - iobj->insn_id == BIN(opt_aset_with) || - iobj->insn_id == BIN(invokesuper))) { + (IS_INSN_ID(iobj, send) || + IS_INSN_ID(iobj, opt_aref_with) || + IS_INSN_ID(iobj, opt_aset_with) || + IS_INSN_ID(iobj, invokesuper))) { /* * send ... * leave @@ -2268,7 +2269,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal if (piobj) { struct rb_call_info *ci = (struct rb_call_info *)piobj->operands[0]; - if (piobj->insn_id == BIN(send) || piobj->insn_id == BIN(invokesuper)) { + if (IS_INSN_ID(piobj, send) || IS_INSN_ID(piobj, invokesuper)) { if (piobj->operands[2] == 0) { /* no blockiseq */ ci->flag |= VM_CALL_TAILCALL; } @@ -2303,13 +2304,13 @@ insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id) static int iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) { - if (iobj->insn_id == BIN(newarray) && iobj->link.next && + if (IS_INSN_ID(iobj, newarray) && iobj->link.next && IS_INSN(iobj->link.next)) { /* * [a, b, ...].max/min -> a, b, c, opt_newarray_max/min */ INSN *niobj = (INSN *)iobj->link.next; - if (niobj->insn_id == BIN(send)) { + if (IS_INSN_ID(niobj, send)) { struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(niobj, 0); if ((ci->flag & VM_CALL_ARGS_SIMPLE) && ci->orig_argc == 0) { switch (ci->mid) { @@ -2326,7 +2327,7 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj) } } - if (iobj->insn_id == BIN(send)) { + if (IS_INSN_ID(iobj, send)) { struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(iobj, 0); const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(iobj, 2); @@ -3229,7 +3230,7 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped) else if (!lhs_splat) { INSN *last = (INSN*)ret->last; if (IS_INSN(&last->link) && - last->insn_id == BIN(newarray) && + IS_INSN_ID(last, newarray) && last->operand_size == 1) { int rlen = FIX2INT(OPERAND_AT(last, 0)); /* special case: assign to aset or attrset */ -- cgit v1.2.3