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

ruby-changes:49971

From: shyouhei <ko1@a...>
Date: Mon, 29 Jan 2018 16:15:13 +0900 (JST)
Subject: [ruby-changes:49971] shyouhei:r62089 (trunk): eliminate CALL_SIMPLE_METHOD

shyouhei	2018-01-29 16:15:08 +0900 (Mon, 29 Jan 2018)

  New Revision: 62089

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

  Log:
    eliminate CALL_SIMPLE_METHOD
    
    Arrange operands of several opt_something insns so that jumps to
    opt_send_without_block can be applied to them. This makes it
    possible to eliminate CALL_SIMPLE_METHOD macro at all.  Results
    in binary size of vm_exec_core to change from 27,008 bytes to
    26,016 bytes on my machine. [close GH-1779]
    
    Note however that PC can point somewhere non-instruction now.
    
    -----------------------------------------------------------
    benchmark results:
    minimum results in each 3 measurements.
    Execution time (sec)
    name    before  after
    so_ackermann     0.450  0.426
    so_array         0.789  0.824
    so_binary_trees  5.760  5.635
    so_concatenate   3.594  3.508
    so_count_words   0.211  0.196
    so_exception     0.256  0.244
    so_fannkuch      1.049  1.044
    so_fasta         1.485  1.472
    so_k_nucleotide  1.195  1.216
    so_lists         0.517  0.513
    so_mandelbrot    2.264  2.394
    so_matrix        0.501  0.468
    so_meteor_contest        2.987  2.912
    so_nbody         1.307  1.289
    so_nested_loop   0.908  0.925
    so_nsieve        1.679  1.614
    so_nsieve_bits   2.131  2.092
    so_object        0.620  0.625
    so_partial_sums  1.623  1.675
    so_pidigits      1.135  1.190
    so_random        0.357  0.321
    so_reverse_complement    0.619  0.583
    so_sieve         0.493  0.496
    so_spectralnorm  1.749  1.737
    
    Speedup ratio: compare with the result of `before' (greater is better)
    name    after
    so_ackermann    1.057
    so_array        0.958
    so_binary_trees 1.022
    so_concatenate  1.024
    so_count_words  1.077
    so_exception    1.049
    so_fannkuch     1.004
    so_fasta        1.009
    so_k_nucleotide 0.983
    so_lists        1.007
    so_mandelbrot   0.946
    so_matrix       1.072
    so_meteor_contest       1.026
    so_nbody        1.013
    so_nested_loop  0.982
    so_nsieve       1.040
    so_nsieve_bits  1.018
    so_object       0.992
    so_partial_sums 0.969
    so_pidigits     0.954
    so_random       1.111
    so_reverse_complement   1.062
    so_sieve        0.994
    so_spectralnorm 1.007

  Modified files:
    trunk/compile.c
    trunk/insns.def
    trunk/vm_insnhelper.h
Index: insns.def
===================================================================
--- insns.def	(revision 62088)
+++ insns.def	(revision 62089)
@@ -1083,18 +1083,15 @@ opt_eq https://github.com/ruby/ruby/blob/trunk/insns.def#L1083
 /* optimized X!=Y. */
 DEFINE_INSN
 opt_neq
-(CALL_INFO ci, CALL_CACHE cc, CALL_INFO ci_eq, CALL_CACHE cc_eq)
+(CALL_INFO ci_eq, CALL_CACHE cc_eq, CALL_INFO ci, CALL_CACHE cc)
 (VALUE recv, VALUE obj)
 (VALUE val)
-// attr bool handles_frame = true;
 {
     val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);
 
     if (val == Qundef) {
-	/* other */
-	PUSH(recv);
-	PUSH(obj);
-	CALL_SIMPLE_METHOD(recv);
+	ADD_PC(2); /* !!! */
+	DISPATCH_ORIGINAL_INSN(opt_send_without_block);
     }
 }
 
@@ -1199,10 +1196,9 @@ opt_aset https://github.com/ruby/ruby/blob/trunk/insns.def#L1196
 /* recv[str] = set */
 DEFINE_INSN
 opt_aset_with
-(CALL_INFO ci, CALL_CACHE cc, VALUE key)
+(VALUE key, CALL_INFO ci, CALL_CACHE cc)
 (VALUE recv, VALUE val)
 (VALUE val)
-// attr bool handles_frame = true;
 {
     VALUE tmp = vm_opt_aset_with(recv, key, val);
 
@@ -1210,29 +1206,26 @@ opt_aset_with https://github.com/ruby/ruby/blob/trunk/insns.def#L1206
 	val = tmp;
     }
     else {
-	/* other */
-	PUSH(recv);
-	PUSH(rb_str_resurrect(key));
+	TOPN(0) = rb_str_resurrect(key);
 	PUSH(val);
-	CALL_SIMPLE_METHOD(recv);
+	ADD_PC(1); /* !!! */
+	DISPATCH_ORIGINAL_INSN(opt_send_without_block);
     }
 }
 
 /* recv[str] */
 DEFINE_INSN
 opt_aref_with
-(CALL_INFO ci, CALL_CACHE cc, VALUE key)
+(VALUE key, CALL_INFO ci, CALL_CACHE cc)
 (VALUE recv)
 (VALUE val)
-// attr bool handles_frame = true;
 {
     val = vm_opt_aref_with(recv, key);
 
     if (val == Qundef) {
-	/* other */
-	PUSH(recv);
 	PUSH(rb_str_resurrect(key));
-	CALL_SIMPLE_METHOD(recv);
+	ADD_PC(1); /* !!! */
+	DISPATCH_ORIGINAL_INSN(opt_send_without_block);
     }
 }
 
Index: compile.c
===================================================================
--- compile.c	(revision 62088)
+++ compile.c	(revision 62089)
@@ -2954,9 +2954,9 @@ insn_set_specialized_instruction(rb_iseq https://github.com/ruby/ruby/blob/trunk/compile.c#L2954
 	VALUE *old_operands = iobj->operands;
 	iobj->operand_size = 4;
 	iobj->operands = (VALUE *)compile_data_alloc(iseq, iobj->operand_size * sizeof(VALUE));
-	iobj->operands[0] = old_operands[0];
+	iobj->operands[0] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE);
 	iobj->operands[1] = Qfalse; /* CALL_CACHE */
-	iobj->operands[2] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE);
+	iobj->operands[2] = old_operands[0];
 	iobj->operands[3] = Qfalse; /* CALL_CACHE */
     }
 
@@ -6092,9 +6092,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6092
 	    ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) {
 	    VALUE str = freeze_literal(iseq, node->nd_args->nd_head->nd_lit);
 	    CHECK(COMPILE(ret, "recv", node->nd_recv));
-	    ADD_INSN3(ret, line, opt_aref_with,
+	    ADD_INSN3(ret, line, opt_aref_with, str,
 		      new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE),
-		      NULL/* CALL_CACHE */, str);
+		      NULL/* CALL_CACHE */);
 	    if (popped) {
 		ADD_INSN(ret, line, pop);
 	    }
@@ -7106,9 +7106,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L7106
 		ADD_INSN(ret, line, swap);
 		ADD_INSN1(ret, line, topn, INT2FIX(1));
 	    }
-	    ADD_INSN3(ret, line, opt_aset_with,
+	    ADD_INSN3(ret, line, opt_aset_with, str,
 		      new_callinfo(iseq, idASET, 2, 0, NULL, FALSE),
-		      NULL/* CALL_CACHE */, str);
+		      NULL/* CALL_CACHE */);
 	    ADD_INSN(ret, line, pop);
 	    break;
 	}
Index: vm_insnhelper.h
===================================================================
--- vm_insnhelper.h	(revision 62088)
+++ vm_insnhelper.h	(revision 62089)
@@ -194,14 +194,6 @@ enum vm_regan_acttype { https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.h#L194
 #define USE_IC_FOR_SPECIALIZED_METHOD 1
 #endif
 
-#define CALL_SIMPLE_METHOD(recv_) do { \
-    struct rb_calling_info calling; \
-    calling.block_handler = VM_BLOCK_HANDLER_NONE; \
-    calling.argc = ci->orig_argc; \
-    vm_search_method(ci, cc, calling.recv = (recv_)); \
-    CALL_METHOD(&calling, ci, cc); \
-} while (0)
-
 #define NEXT_CLASS_SERIAL() (++ruby_vm_class_serial)
 #define GET_GLOBAL_METHOD_STATE() (ruby_vm_global_method_state)
 #define INC_GLOBAL_METHOD_STATE() (++ruby_vm_global_method_state)

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

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