[前][次][番号順一覧][スレッド一覧]

ruby-changes:51041

From: nobu <ko1@a...>
Date: Mon, 23 Apr 2018 21:51:25 +0900 (JST)
Subject: [ruby-changes:51041] nobu:r63248 (trunk): compile.c: copy a short insn with leave

nobu	2018-04-23 21:51:18 +0900 (Mon, 23 Apr 2018)

  New Revision: 63248

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63248

  Log:
    compile.c: copy a short insn with leave
    
    * compile.c (iseq_peephole_optimize): copy not only `leave`, with
      a non-operand instruction, which are not longer than `jump`.

  Modified files:
    trunk/compile.c
Index: compile.c
===================================================================
--- compile.c	(revision 63247)
+++ compile.c	(revision 63248)
@@ -2646,7 +2646,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L2646
     optimize_checktype(iseq, iobj);
 
     if (IS_INSN_ID(iobj, jump)) {
-	INSN *niobj, *diobj, *piobj;
+	INSN *niobj, *diobj, *piobj, *dniobj;
 	diobj = (INSN *)get_destination_insn(iobj);
 	niobj = (INSN *)get_next_insn(iobj);
 
@@ -2677,7 +2677,10 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L2677
 	    remove_unreachable_chunk(iseq, iobj->link.next);
 	    goto again;
 	}
-	else if (IS_INSN_ID(diobj, leave)) {
+	else if (IS_INSN_ID(diobj, leave) ? !(dniobj = 0) :
+		 (diobj->operand_size == 0 &&
+		  (dniobj = (INSN *)get_next_insn(diobj)) != 0 &&
+		  (IS_INSN_ID(dniobj, leave) || (dniobj = 0)))) {
 	    INSN *pop;
 	    /*
 	     *  jump LABEL
@@ -2693,12 +2696,19 @@ iseq_peephole_optimize(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L2696
 	     */
 	    /* replace */
 	    unref_destination(iobj, 0);
-	    iobj->insn_id = BIN(leave);
+	    iobj->insn_id = diobj->insn_id;
 	    iobj->operand_size = 0;
 	    iobj->insn_info = diobj->insn_info;
+	    if (dniobj) {
+		dniobj = new_insn_body(iseq, dniobj->insn_info.line_no, BIN(leave), 0);
+		ELEM_INSERT_NEXT(&iobj->link, &dniobj->link);
+	    }
+	    else {
+		dniobj = iobj;
+	    }
 	    /* adjust stack depth */
 	    pop = new_insn_body(iseq, diobj->insn_info.line_no, BIN(pop), 0);
-	    ELEM_INSERT_NEXT(&iobj->link, &pop->link);
+	    ELEM_INSERT_NEXT(&dniobj->link, &pop->link);
 	    goto again;
 	}
 	else if ((piobj = (INSN *)get_prev_insn(iobj)) != 0 &&

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]