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

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/

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