_mjit_compile_pc_and_sp.erb: always move pc

to fix the wrong line number on #caller_locations or rb_profile_frames.

Actually we would be able to move it only when method call (of
caller_locations) or C extension invocation (calling rb_profile_frames)
can happen.

This degrades performance. Optcarrot fps becomes...
before: 71.78976052783555
after: 67.65429356624131

I think I can lazily move it and fix the performance issue, even
improving the performance for the situation catch table exists.
But let me fix this bug first...

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64283 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
k0kubun 2018-08-11 05:33:15 +00:00
Родитель 92c03be888
Коммит d5e27d7a5a
2 изменённых файлов: 20 добавлений и 3 удалений

Просмотреть файл

@ -795,6 +795,25 @@ class TestJIT < Test::Unit::TestCase
end;
end
def test_caller_locations_without_catch_table
out, _ = eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1)
begin;
def b # 2
caller_locations.first # 3
end # 4
# 5
def a # 6
print # <-- don't leave PC here # 7
b # 8
end
puts a
puts a
end;
lines = out.lines
assert_equal("-e:8:in `a'\n", lines[0])
assert_equal("-e:8:in `a'\n", lines[1])
end
private
# Some tests are stil failing on VC++.

Просмотреть файл

@ -7,9 +7,7 @@
%
% # 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) {
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)); */
%
% # JIT: move sp to use or preserve stack variables
if (status->local_stack_p) {