1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test
k0kubun 8a15857a7f mjit_compile.c: use local variables for stack
if catch_except_p is FALSE. If catch_except_p is TRUE, stack values
should be on VM's stack when exception is thrown and the JIT-ed frame
is re-executed by VM's exception handler. If it's FALSE, the JIT-ed
frame won't be re-executed and don't need to keep values on VM's stack.

Using local variables allows us to reduce cfp->sp motion. Moving cfp->sp
is needed only for insns whose handles_frame? is false. So it improves
performance.

_mjit_compile_insn.erb: Prepare `stack_size` variable for GET_SP,
STACK_ADDR_FROM_TOP, TOPN macros. Share pc and sp motion partial view.
Use cancel handler created in mjit_compile.c.

_mjit_compile_send.erb: ditto. Also, when iseq->body->catch_except_p is
TRUE, this stops to call mjit_exec directly. I described the reason in
vm_insnhelper.h's comment for EXEC_EC_CFP.

_mjit_compile_pc_and_sp.erb: Shared logic for moving sp and pc. As you
can see from thsi file, when status->local_stack_p is TRUE and
insn.handles_frame? is false, moving sp is skipped. But if
insn.handles_frame? is true, values should be rolled back to VM's stack.
common.mk: add dependency for the file

_mjit_compile_insn_body.erb: Set sp value before canceling JIT on
DISPATCH_ORIGINAL_INSN. Replace GET_SP, STACK_ADDR_FROM_TOP, TOPN macros
for the case ocal_stack_p is TRUE and insn.handles_frame? is false.
In that case, values are not available on VM's stack and those macros
should be replaced.

mjit_compile.inc.erb: updated comments of macros which are supported by
JIT compiler. All references to `cfp->sp` should be replaced and thus
INC_SP, SET_SV, PUSH are no longer supported for now, because they are
not used now.

vm_exec.h: moved EXEC_EC_CFP definition to vm_insnhelper.h because it's
tighly coupled to CALL_METHOD.

vm_insnhelper.h: Have revised EXEC_EC_CFP definition moved from vm_exec.h.
Now it triggers mjit_exec for VM, and has the guard for catch_except_p
on JIT-ed code. See comments for details. CALL_METHOD delegates
triggering mjit_exec to EXEC_EC_CFP.

insns.def: Stopped using EXEC_EC_CFP for the case we don't want to
trigger mjit_exec. Those insns (defineclass, opt_call_c_function) are
not supported by JIT and it's safe to use RESTORE_REGS(), NEXT_INSN().
expandarray is changed to pass GET_SP() to replace the macro in
_mjit_compile_insn_body.erb.

vm_insnhelper.c: change to take sp for the above reason.

[close https://github.com/ruby/ruby/pull/1828]

This patch resurrects the performance which was attached in
[Feature #14235].

* Benchmark

Optcarrot (with configuration for benchmark_driver.gem)
https://github.com/benchmark-driver/optcarrot

$ benchmark-driver benchmark.yml --verbose 1 --rbenv 'before;before+JIT::before,--jit;after;after+JIT::after,--jit' --repeat-count 10
before: ruby 2.6.0dev (2018-03-04 trunk 62652) [x86_64-linux]
before+JIT: ruby 2.6.0dev (2018-03-04 trunk 62652) +JIT [x86_64-linux]
after: ruby 2.6.0dev (2018-03-04 local-variable.. 62652) [x86_64-linux]
last_commit=mjit_compile.c: use local variables for stack
after+JIT: ruby 2.6.0dev (2018-03-04 local-variable.. 62652) +JIT [x86_64-linux]
last_commit=mjit_compile.c: use local variables for stack
Calculating -------------------------------------
                         before  before+JIT       after   after+JIT
           optcarrot     53.552      59.680      53.697      63.358 fps

Comparison:
                        optcarrot
           after+JIT:        63.4 fps
          before+JIT:        59.7 fps - 1.06x  slower
               after:        53.7 fps - 1.18x  slower
              before:        53.6 fps - 1.18x  slower

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62655 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-03-04 07:04:40 +00:00
..
-ext- mjit_compile.c: merge initial JIT compiler 2018-02-04 11:22:28 +00:00
base64
benchmark
bigdecimal $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
cgi
coverage test/coverage/test_coverage.rb: make the expected value the same as 2.4 2017-12-20 04:45:05 +00:00
csv
date date_core.c: defensive code 2018-02-25 04:28:11 +00:00
dbm skip some tests so that no failure occurs in root privilege 2018-01-10 10:39:09 +00:00
digest
drb drb: use \A and \z 2017-12-30 12:10:43 +00:00
dtrace
erb lib/erb.rb: Add uplevel to warn 2018-02-24 08:54:19 +00:00
etc
excludes
fiddle long long is a C99ism 2018-02-17 09:51:23 +00:00
fileutils
gdbm Fix indent and use as skipped message instead of comment 2018-01-11 13:56:04 +00:00
io test/io/console/test_io_console.rb (test_oflush): Avoid race condition 2018-02-15 05:34:20 +00:00
irb skip some tests so that no failure occurs in root privilege 2018-01-10 10:39:09 +00:00
json
lib test_rubyoptions.rb: don't test --jit if not supported 2018-02-22 15:11:12 +00:00
logger
matrix
minitest
misc
mkmf a C source code must end with EOL 2018-02-17 10:04:22 +00:00
monitor
net net/pop: make modified strings mutable 2018-01-30 00:22:22 +00:00
nkf
objspace
open-uri open-uri defines URI.open defined as an alias. 2017-12-21 14:15:04 +00:00
openssl openssl: suppress report_on_exception warning 2017-12-15 08:19:32 +00:00
optparse optparse.rb: froze string literals 2018-01-26 03:41:04 +00:00
ostruct lib/ostruct.rb: Use FrozenError instead of RuntimeError. 2018-02-06 23:52:30 +00:00
pathname skip some tests so that no failure occurs in root privilege 2018-01-10 10:39:09 +00:00
psych Merge psych-3.0.2 from ruby/psych. 2017-12-19 09:44:33 +00:00
rdoc skip some tests so that no failure occurs in root privilege 2018-01-10 10:39:09 +00:00
readline $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
resolv fix for IPv6 env 2018-01-11 19:41:49 +00:00
rexml
rinda
ripper Fix CMDARG manipulation 2018-02-22 12:51:41 +00:00
rss
ruby mjit_compile.c: use local variables for stack 2018-03-04 07:04:40 +00:00
rubygems Remove unnecessary []s 2018-02-17 14:03:52 +00:00
scanf
sdbm skip some tests so that no failure occurs in root privilege 2018-01-10 10:39:09 +00:00
shell
socket init.c: encode socket error message 2018-01-23 15:31:22 +00:00
stringio
strscan
syslog
testunit
thread mjit_compile.c: merge initial JIT compiler 2018-02-04 11:22:28 +00:00
uri
webrick mjit_compile.c: merge initial JIT compiler 2018-02-04 11:22:28 +00:00
win32ole $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
yaml
zlib
colors
runner.rb
test_abbrev.rb
test_cmath.rb
test_delegate.rb
test_extlibs.rb
test_find.rb Fix indent and use as skipped message instead of comment 2018-01-11 13:56:04 +00:00
test_forwardable.rb Add test for Forwardable#def_delegator with r55366. 2018-02-01 09:07:16 +00:00
test_ipaddr.rb
test_mutex_m.rb
test_observer.rb
test_open3.rb
test_pp.rb
test_prettyprint.rb
test_prime.rb
test_pstore.rb
test_pty.rb
test_rbconfig.rb
test_securerandom.rb
test_set.rb Add a new #filter alias for #select 2018-02-25 13:52:07 +00:00
test_shellwords.rb
test_singleton.rb
test_syslog.rb
test_tempfile.rb $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
test_time.rb
test_timeout.rb
test_tmpdir.rb $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
test_tracer.rb
test_tsort.rb
test_unicode_normalize.rb
test_weakref.rb
test_win32api.rb