ruby-changes:50539
From: k0kubun <ko1@a...>
Date: Tue, 6 Mar 2018 22:23:28 +0900 (JST)
Subject: [ruby-changes:50539] k0kubun:r62678 (trunk): _mjit_compile_pc_and_sp.erb: skip moving pc
k0kubun 2018-03-06 22:23:22 +0900 (Tue, 06 Mar 2018) New Revision: 62678 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62678 Log: _mjit_compile_pc_and_sp.erb: skip moving pc on !body->catch_except_p. We need to move pc only when JIT execution is canceled if the frame does not catch an exception. _mjit_compile_insn.erb: lazily move pc for such optimized case _mjit_compile_insn_body.erb: ditto _mjit_compile_send.erb: ditto * Optcarrot benchmark (--jit) Before: 65.31 fps After: 67.82 fps Modified files: 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_pc_and_sp.erb trunk/tool/ruby_vm/views/_mjit_compile_send.erb Index: tool/ruby_vm/views/_mjit_compile_insn.erb =================================================================== --- tool/ruby_vm/views/_mjit_compile_insn.erb (revision 62677) +++ tool/ruby_vm/views/_mjit_compile_insn.erb (revision 62678) @@ -74,6 +74,9 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn.erb#L74 % if trace_enablable_insns.include?(insn.name) fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_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); + if (!body->catch_except_p) { + fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); + } fprintf(f, " goto cancel;\n"); fprintf(f, " }\n"); % end Index: tool/ruby_vm/views/_mjit_compile_insn_body.erb =================================================================== --- tool/ruby_vm/views/_mjit_compile_insn_body.erb (revision 62677) +++ tool/ruby_vm/views/_mjit_compile_insn_body.erb (revision 62678) @@ -72,6 +72,9 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_insn_body.erb#L72 if (status->local_stack_p) { fprintf(f, " reg_cfp->sp = (VALUE *)reg_cfp->bp + %d;\n", b->stack_size + 1); } + if (!body->catch_except_p) { + fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos); + } fprintf(f, " goto cancel;\n"); % else % if insn.handles_frame? Index: tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb =================================================================== --- tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb (revision 62677) +++ tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb (revision 62678) @@ -5,12 +5,15 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb#L5 % # conditions mentioned in the file COPYING are met. Consult the file for % # details. % -% # JIT: move pc so that catch table lookup condition is met +% # JIT: Move pc so that catch table lookup condition is met. If the ISeq might not catch an exception, +% # the pc motion is optimized away and thus pc should be set properly before `goto cancel`. + if (body->catch_except_p) { % if insn.handles_frame? - fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */ + fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */ % else - fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos); + fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos); % end + } % % # JIT: move sp to use or preserve stack variables if (status->local_stack_p) { Index: tool/ruby_vm/views/_mjit_compile_send.erb =================================================================== --- tool/ruby_vm/views/_mjit_compile_send.erb (revision 62677) +++ tool/ruby_vm/views/_mjit_compile_send.erb (revision 62678) @@ -75,6 +75,9 @@ https://github.com/ruby/ruby/blob/trunk/tool/ruby_vm/views/_mjit_compile_send.erb#L75 % # JIT: We should evaluate ISeq modified for TracePoint if it's enabled. Note: This is slow. fprintf(f, " if (UNLIKELY(ruby_vm_event_enabled_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); + if (!body->catch_except_p) { + fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); + } fprintf(f, " goto cancel;\n"); fprintf(f, " }\n"); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/