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

ruby-changes:55135

From: ko1 <ko1@a...>
Date: Mon, 25 Mar 2019 15:58:55 +0900 (JST)
Subject: [ruby-changes:55135] ko1:r67342 (trunk): use cfp->bp more.

ko1	2019-03-25 15:58:50 +0900 (Mon, 25 Mar 2019)

  New Revision: 67342

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

  Log:
    use cfp->bp more.
    
    cfp->bp was (re-)introduced by Kokubun san, but VM doesn't use it
    because I (ko1) want to remove it in a future. But using it make
    leave instruction fast because of sp consisntency check.
    So now VM uses cfp->bp.
    
    To use cfp->bp, I checked the value and I found that it is not a
    "initial value of sp" but a "initial value of ep". Fix this problem
    and fix all bp references (this is why bp is renamed to bp_).

  Modified files:
    trunk/mjit_compile.c
    trunk/tool/ruby_vm/views/_mjit_compile_insn.erb
    trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb
    trunk/tool/ruby_vm/views/_mjit_compile_ivar.erb
    trunk/tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb
    trunk/tool/ruby_vm/views/_mjit_compile_send.erb
    trunk/vm_core.h
    trunk/vm_insnhelper.c
Index: mjit_compile.c
===================================================================
--- mjit_compile.c	(revision 67341)
+++ mjit_compile.c	(revision 67342)
@@ -191,7 +191,7 @@ compile_cancel_handler(FILE *f, const st https://github.com/ruby/ruby/blob/trunk/mjit_compile.c#L191
     fprintf(f, "\ncancel:\n");
     if (status->local_stack_p) {
         for (i = 0; i < body->stack_max; i++) {
-            fprintf(f, "    *((VALUE *)reg_cfp->bp + %d) = stack[%d];\n", i + 1, i);
+            fprintf(f, "    *((VALUE *)reg_cfp->bp_ + %d) = stack[%d];\n", i, i);
         }
     }
     fprintf(f, "    return Qundef;\n");
Index: tool/ruby_vm/views/_mjit_compile_ivar.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_ivar.erb	(revision 67341)
+++ tool/ruby_vm/views/_mjit_compile_ivar.erb	(revision 67342)
@@ -41,7 +41,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_ivar.erb#L41
 % end
         fprintf(f, "    else {\n");
         fprintf(f, "        reg_cfp->pc = original_body_iseq + %d;\n", pos);
-        fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
+        fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size);
         fprintf(f, "        goto cancel;\n");
         fprintf(f, "    }\n");
 
Index: tool/ruby_vm/views/_mjit_compile_insn.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 67341)
+++ tool/ruby_vm/views/_mjit_compile_insn.erb	(revision 67342)
@@ -62,7 +62,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn.erb#L62
 % # JIT: We should evaluate ISeq modified for TracePoint if it's enabled. Note: This is slow.
 % unless insn.always_leaf?
         fprintf(f, "    if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
-        fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %> + 1);
+        fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %>);
         if (!pc_moved_p) {
             fprintf(f, "        reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
         }
Index: tool/ruby_vm/views/_mjit_compile_insn_body.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_insn_body.erb	(revision 67341)
+++ tool/ruby_vm/views/_mjit_compile_insn_body.erb	(revision 67342)
@@ -76,7 +76,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb#L76
 %   when /\A\s+CALL_SIMPLE_METHOD\(\);\s+\z/
 %     # For `opt_xxx`'s fallbacks.
         if (status->local_stack_p) {
-            fprintf(f, "            reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
+            fprintf(f, "            reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size);
         }
         fprintf(f, "            reg_cfp->pc = original_body_iseq + %d;\n", pos);
         fprintf(f, "            goto cancel;\n");
Index: tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb	(revision 67341)
+++ tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb	(revision 67342)
@@ -20,7 +20,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb#L20
             {
                 rb_snum_t i, push_size;
                 push_size = -<%= insn.call_attribute('sp_inc') %> + <%= insn.rets.size %> - <%= insn.pops.size %>;
-                fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp + %ld + 1;\n", push_size); /* POPN(INSN_ATTR(popn)); */
+                fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
                 for (i = 0; i < push_size; i++) {
                     fprintf(f, "    *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
                 }
@@ -29,8 +29,8 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb#L29
         }
         else {
 % if insn.handles_sp?
-            fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1 - <%= insn.pops.size %>); /* POPN(INSN_ATTR(popn)); */
+            fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size - <%= insn.pops.size %>); /* POPN(INSN_ATTR(popn)); */
 % else
-            fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
+            fprintf(f, "    reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size);
 % end
         }
Index: tool/ruby_vm/views/_mjit_compile_send.erb
===================================================================
--- tool/ruby_vm/views/_mjit_compile_send.erb	(revision 67341)
+++ tool/ruby_vm/views/_mjit_compile_send.erb	(revision 67342)
@@ -37,7 +37,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_send.erb#L37
             fprintf(f, "    if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
             fprintf(f, "        RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
             fprintf(f, "        reg_cfp->pc = original_body_iseq + %d;\n", pos);
-            fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1);
+            fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size);
             fprintf(f, "        goto cancel;\n");
             fprintf(f, "    }\n");
 
@@ -77,7 +77,7 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_send.erb#L77
 
 % # JIT: We should evaluate ISeq modified for TracePoint if it's enabled. Note: This is slow.
             fprintf(f, "    if (UNLIKELY(ruby_vm_event_enabled_global_flags & ISEQ_TRACE_EVENTS)) {\n");
-            fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %> + 1);
+            fprintf(f, "        reg_cfp->sp = (VALUE *)reg_cfp->bp_ + %d;\n", b->stack_size + (int)<%= insn.call_attribute('sp_inc') %>);
             if (!pc_moved_p) {
                 fprintf(f, "        reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
             }
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 67341)
+++ vm_insnhelper.c	(revision 67342)
@@ -299,8 +299,8 @@ vm_push_frame(rb_execution_context_t *ec https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L299
     *sp   = type;       /* ep[-0] / ENV_FLAGS */
 
     /* Store initial value of ep as bp to skip calculation cost of bp on JIT cancellation. */
-    cfp->ep = cfp->bp = sp;
-    cfp->sp = sp + 1;
+    cfp->ep = sp;
+    cfp->bp_ = cfp->sp = sp + 1;
 
 #if VM_DEBUG_BP_CHECK
     cfp->bp_check = sp + 1;
@@ -1640,6 +1640,7 @@ double_cmp_ge(double a, double b) https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1640
 static VALUE *
 vm_base_ptr(const rb_control_frame_t *cfp)
 {
+#if 0
     const rb_control_frame_t *prev_cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
 
     if (cfp->iseq && VM_FRAME_RUBYFRAME_P(cfp)) {
@@ -1661,6 +1662,9 @@ vm_base_ptr(const rb_control_frame_t *cf https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L1662
     else {
 	return NULL;
     }
+#else
+    return cfp->bp_;
+#endif
 }
 
 /* method call processes with call_info */
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 67341)
+++ vm_core.h	(revision 67342)
@@ -763,7 +763,7 @@ typedef struct rb_control_frame_struct { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L763
     VALUE self;			/* cfp[3] / block[0] */
     const VALUE *ep;		/* cfp[4] / block[1] */
     const void *block_code;     /* cfp[5] / block[2] */ /* iseq or ifunc */
-    const VALUE *bp;		/* cfp[6] */
+    VALUE *bp_;			/* cfp[6] */
 
 #if VM_DEBUG_BP_CHECK
     VALUE *bp_check;		/* cfp[7] */

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

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