зеркало из https://github.com/github/ruby.git
_mjit_compile_pc_and_sp.erb: skip moving pc
when catch_except_p is false and insn.always_leaf? is true (never makes arbitrary method call in the insn). On Optcarrot, unfortunately this didn't have measureable performance impact. But still this is a good direction since it becomes much faster when marking all insns as always leaf. bare_instructions.rb: add `#always_leaf?` that indicates the insn can always be considered as leaf. Using dynamic leaf for JIT would be hard since it requires to discard outdated code somehow. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64683 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
24e30ef76e
Коммит
67bd8fb36b
|
@ -105,6 +105,10 @@ class RubyVM::BareInstructions
|
|||
/\b(false|0)\b/ !~ @attrs['handles_sp'].expr.expr
|
||||
end
|
||||
|
||||
def always_leaf?
|
||||
@attrs['leaf'].expr.expr == 'true;'
|
||||
end
|
||||
|
||||
def complicated_return_values?
|
||||
@sig[:ret].any? {|i| i == '...' }
|
||||
end
|
||||
|
|
|
@ -5,8 +5,10 @@
|
|||
% # conditions mentioned in the file COPYING are met. Consult the file for
|
||||
% # details.
|
||||
%
|
||||
% # JIT: Move pc so that catch table lookup condition is met, and for #caller_locations and rb_profile_frames.
|
||||
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
|
||||
% # JIT: Move pc for catch table on catch_except_p, and for #caller_locations and rb_profile_frames on !insn.always_leaf?
|
||||
if (body->catch_except_p || <%= insn.always_leaf? ? 'FALSE' : 'TRUE' %>) {
|
||||
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
|
||||
}
|
||||
%
|
||||
% # JIT: move sp to use or preserve stack variables
|
||||
if (status->local_stack_p) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче