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/