summaryrefslogtreecommitdiff
path: root/test/ruby/test_jit.rb
AgeCommit message (Collapse)Author
2018-03-04mjit_compile.c: use local variables for stackk0kubun
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-02-22test_rubyoptions.rb: don't test --jit if not supportedk0kubun
test/lib/jit_support.rb: carved out JITSupport test/ruby/test_jit.rb: ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62533 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-13mjit_compile.inc.erb: replace opt_key insnk0kubun
with opt_send_without_block insn if call cache has valid ISeq. If the receiver is not optimized target of opt_key (i.e. Hash or Array), it triggers JIT cancel and it would be slow. This change allows JIT to drop the check for Hash/Array and continue to execute JIT even if the receiver is not Hash or Array. See the following benchmark results. It's not improved so much, but it would be effective when we achieve Ruby method inlining in _mjit_compile_send.erb. * Micro benchmark Given the following bench.rb, ``` class HashWithIndifferentAccess < Hash def []=(key, value) super(key.to_s, value) end def [](key) super(key.to_s) end end indhash = HashWithIndifferentAccess.new indhash[:foo] = 'bar' key = 'foo' 100000000.times do indhash[key] end ``` ** before ``` $ time ./ruby --disable-gems --jit-verbose=1 /tmp/bench.rb JIT success (31.4ms): block in <main>@/tmp/bench.rb:15 -> /tmp/_ruby_mjit_p18206u0.c JIT success (669.3ms): []@/tmp/bench.rb:6 -> /tmp/_ruby_mjit_p18206u1.c Successful MJIT finish ./ruby --disable-gems --jit-verbose=1 /tmp/bench.rb 12.21s user 0.04s system 107% cpu 11.394 total ``` ** after ``` $ time ./ruby --disable-gems --jit-verbose=1 /tmp/bench.rb JIT success (41.0ms): block in <main>@/tmp/bench.rb:15 -> /tmp/_ruby_mjit_p17293u0.c JIT success (679.0ms): []@/tmp/bench.rb:6 -> /tmp/_ruby_mjit_p17293u1.c Successful MJIT finish ./ruby --disable-gems --jit-verbose=1 /tmp/bench.rb 11.54s user 0.06s system 108% cpu 10.726 total ``` The execution time is shortened. * optcarrot benchmark Optcarrot has no room to be improved by this change. Almost nothing is changed. fps: 59.54 (before) -> 59.51 (after) * discourse benchmark I expected this to be improved a little, but it isn't too. ** before (JIT) ``` categories_admin: 50: 12 75: 13 90: 14 99: 22 home_admin: 50: 12 75: 13 90: 16 99: 22 topic_admin: 50: 12 75: 13 90: 15 99: 21 categories: 50: 18 75: 19 90: 23 99: 27 home: 50: 3 75: 4 90: 4 99: 12 topic: 50: 11 75: 11 90: 14 99: 20 ``` ** after (JIT) ``` categories_admin: 50: 12 75: 12 90: 16 99: 24 home_admin: 50: 12 75: 12 90: 14 99: 21 topic_admin: 50: 12 75: 13 90: 16 99: 21 categories: 50: 17 75: 18 90: 23 99: 32 home: 50: 3 75: 4 90: 4 99: 10 topic: 50: 11 75: 12 90: 13 99: 20 ``` git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62398 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-12test_jit.rb: prettify script in messagek0kubun
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62381 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-12test_jit.rb: explicitly skip for unsupported onesk0kubun
MSP-Greg watches this metrics and this would be helpful for him. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62380 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-12test_jit.rb: split test_compile_insnsnobu
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62378 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-10test_jit.rb: cover most insn compilationsk0kubun
test_compile_insns has only basic tests to improve coverage. Other severer tests should be added with different names. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62348 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-09.travis.yml: force to execute JIT test on Travisk0kubun
test_jit.rb: with environment variable RUBY_FORCE_TEST_JIT, we can force to test JIT availability. I wanted to have such CI, but Travis was the only option which I can modify easily. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: don't force to test --jit-waitk0kubun
for platforms which can't use JIT. Such platforms can time out with eval_with_jit. http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/509911 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/509904 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62314 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: fix typok0kubun
This is notified by zns-san. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62312 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: add forgotten checkk0kubun
I was going to check this in r62310... git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62311 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: check JIT support more conservativelyk0kubun
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62310 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: remove unnecessary requirek0kubun
At first I was going to check the name of `RbConfig::CONFIG['CC']` and use shellwords for it, but I decided not to do so. Thus removing obsoleted require in r62307. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62309 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08test_jit.rb: try to test JIT againk0kubun
This commit reverts r62297, revising the check if JIT is supported or not. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62307 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-08revert r62291 for nowk0kubun
While some of CIs are succeeding and the test succeeds on my laptop, some other CIs are failing. As I don't have time to fix it until I come back to home, reverting this for now. Failures: https://rubyci.org/logs/www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20180208T000401Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/scw-9d6766/ruby-trunk/log/20180207T201706Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/ubuntu1604/ruby-trunk/log/20180207T183004Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/gentoo/ruby-trunk/log/20180207T213004Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/centos6/ruby-trunk/log/20180207T213003Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/fedora25/ruby-trunk/log/20180207T213003Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/fedora26/ruby-trunk/log/20180207T213003Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/opensuseleap/ruby-trunk/log/20180207T213001Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/rhel_zlinux/ruby-trunk/log/20180207T223303Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/osx1011/ruby-trunk/log/20180207T234501Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/osx1012/ruby-trunk/log/20180207T234501Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/icc-x64/ruby-trunk/log/20180207T210002Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable10x/ruby-trunk/log/20180207T231805Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11x/ruby-trunk/log/20180207T232403Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable10s/ruby-trunk/log/20180207T171914Z.fail.html.gz https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11s/ruby-trunk/log/20180207T232503Z.fail.html.gz https://rubyci.org/logs/mswinci.japaneast.cloudapp.azure.com/vc12-x64/ruby-trunk/log/20180207T172813Z.fail.html.gz http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506100 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506114 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/506119 http://ci.rvm.jp/results/trunk_clang_39@silicon-docker/506170 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/506176 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506192 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506202 http://ci.rvm.jp/results/trunk_clang_39@silicon-docker/506244 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506271 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506280 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/506323 http://ci.rvm.jp/results/trunk_clang_50@silicon-docker/506325 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506342 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506354 http://ci.rvm.jp/results/trunk_clang_39@silicon-docker/506385 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/506389 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506409 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506425 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/506471 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506484 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506495 http://ci.rvm.jp/results/trunk-test@x2/506524 http://ci.rvm.jp/results/trunk-vm-asserts@silicon-docker/506547 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506556 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506579 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/506582 http://ci.rvm.jp/results/trunk_clang_50@silicon-docker/506634 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506638 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506663 http://ci.rvm.jp/results/trunk-test@frontier/506690 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/506718 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506728 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/506752 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506754 http://ci.rvm.jp/results/trunk-gc-asserts@silicon-docker/506782 http://ci.rvm.jp/results/trunk_clang_38@silicon-docker/506799 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506816 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506835 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/506879 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506903 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/506920 http://ci.rvm.jp/results/trunk-test@frontier/506955 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/506994 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507012 http://ci.rvm.jp/results/trunk-vm-asserts@silicon-docker/507036 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/507037 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/507053 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/507081 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507097 http://ci.rvm.jp/results/trunk_clang_40@silicon-docker/507136 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/507165 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507178 http://ci.rvm.jp/results/trunk-nopara@silicon-docker/507180 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/507257 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507268 http://ci.rvm.jp/results/trunk-gc-asserts@silicon-docker/507303 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/507342 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507355 http://ci.rvm.jp/results/trunk_gcc5@silicon-docker/507434 http://ci.rvm.jp/results/trunk_gcc4@silicon-docker/507448 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62297 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-07test_jit.rb: make JIT count test optionalk0kubun
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-07test_jit.rb: add initial test for JITk0kubun
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62291 b2dd03c8-39d4-4d8f-98ff-823fe69b080e