Commit graph

64552 commits

Author SHA1 Message Date
Nobuyoshi Nakada
74c345c7b8 Removed no longer used flags 2020-06-27 10:55:18 +09:00
Nobuyoshi Nakada
61984d4760 Not to rewrite node while compiling
Moved this hack mark to an argument to `compile_hash`.
> Bad Hack: temporarily mark hash node with flag so
> compile_hash can compile call differently.
2020-06-27 10:55:18 +09:00
Takashi Kokubun
ad1ebefefe
Avoid duplicated "when"s [ci skip] 2020-06-26 01:40:20 -07:00
Takashi Kokubun
a0aacd2efc
Add a NEWS placeholder for disposable cc [ci skip]
asked by ko1 to put this.
2020-06-26 01:36:53 -07:00
Takashi Kokubun
200c5f4075
Add NEWS entries about JIT optimizations
and a related VM improvement.

JIT related commits:

* Code size reduction
  * Deduplicate functions on JIT compaction 818d6d3336
  * Avoid always inlining cold paths of ivar fcd2576290
  * Inline only fast path of rb_class_of b16a2aa938
  * Eliminate a call instruction on deopt 61b14bb32b
* Cold path partitioning
  * Mark method call slow paths as COLDFUNC 0e5a58b6bf
  * Mark vm_stackoverflow as NOINLINE COLDFUNC 9d71373c23
  * Create mjit_exec_slowpath and mark it as NOINLINE COLDFUNC 083a17a82a
* Primitive.attr! 'inline' / Integer#zero? 7561db8c00
  * Kernel#class 946e5cc668
  * (more to come...)
* Properly generate opt_send for cfunc cc 7982dc1dfd
* Optimize exivar access b736ea63bd
* Make JIT-ed leave leaf 151f8be40d
* Inline vm_call_cfunc b9d3ceee8f

VM:

* Enable fastpath on invokesuper 5c27681813
  * History: https://speakerdeck.com/k0kubun/ruby-3-samituto?slide=40 (in Japanese)
2020-06-26 01:33:54 -07:00
Nobuyoshi Nakada
4949df498a
[ruby/fiddle] Fixed typos
a09e66adf4
6cab9b45d6
ab72b19bed
2020-06-26 17:05:27 +09:00
Takashi Kokubun
40b40523dc
Show what's inlined first in "JIT inline" log
and add a debug log
2020-06-25 23:50:19 -07:00
Takashi Kokubun
7982dc1dfd
Decide JIT-ed insn based on cached cfunc
for opt_* insns.

opt_eq handles rb_obj_equal inside opt_eq, and all other cfunc is
handled by opt_send_without_block. Therefore we can't decide which insn
should be generated by checking whether it's cfunc cc or not.

```
$ benchmark-driver -v --rbenv 'before --jit;after --jit' benchmark/mjit_opt_cc_insns.yml --repeat-count=4
before --jit: ruby 2.8.0dev (2020-06-26T05:21:43Z master 9dbc2294a6) +JIT [x86_64-linux]
after --jit: ruby 2.8.0dev (2020-06-26T06:30:18Z master 75cece1b0b) +JIT [x86_64-linux]
last_commit=Decide JIT-ed insn based on cached cfunc
Calculating -------------------------------------
                     before --jit  after --jit
        mjit_nil?(1)      73.878M      74.021M i/s -     40.000M times in 0.541432s 0.540391s
         mjit_not(1)      72.635M      74.601M i/s -     40.000M times in 0.550702s 0.536187s
     mjit_eq(1, nil)       7.331M       7.445M i/s -      8.000M times in 1.091211s 1.074596s
     mjit_eq(nil, 1)      49.450M      64.711M i/s -      8.000M times in 0.161781s 0.123627s

Comparison:
                     mjit_nil?(1)
         after --jit:  74020528.4 i/s
        before --jit:  73878185.9 i/s - 1.00x  slower

                      mjit_not(1)
         after --jit:  74600882.0 i/s
        before --jit:  72634507.6 i/s - 1.03x  slower

                  mjit_eq(1, nil)
         after --jit:   7444657.4 i/s
        before --jit:   7331304.3 i/s - 1.02x  slower

                  mjit_eq(nil, 1)
         after --jit:  64710790.6 i/s
        before --jit:  49449507.4 i/s - 1.31x  slower
```
2020-06-25 23:33:08 -07:00
Takashi Kokubun
9dbc2294a6
Collect insns from a child process
to make sure :opt_invokebuiltin_delegate_leave doesn't become
:(trace_)opt_invokebuiltin_delegate.

This is to prevent a warning like
> /tmp/ruby/v3/src/trunk-test/test/ruby/test_jit.rb:618: warning:
'opt_invokebuiltin_delegate_leave' insn is not included in the script.
Actual insns are: opt_invokebuiltin_delegate leave
2020-06-25 22:21:43 -07:00
Yusuke Endoh
a640bcee04 test/ruby/test_settracefunc.rb: Suppress a warning
20200626T033003Z.log.html.gz
```
/home/chkbuild/chkbuild/tmp/build/20200626T033003Z/ruby/test/ruby/test_settracefunc.rb:2299: warning: ambiguous first argument; put parentheses or a space even after `/' operator
```
2020-06-26 14:15:01 +09:00
Takashi Kokubun
5c03e4680e
Try increasing read timeout of rinda tests
To prevent random failure with --jit-wait like
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3026615
2020-06-25 22:11:56 -07:00
Koichi Sasada
8070cb56db
fix return event and opt_invokebuiltin_delegate_leave (#3256)
If :return event is specified for a opt_invokebuiltin_delegate_leave
and leave combination, the instructions should be
  opt_invokebuiltin_delegate
  trace_return
instructions. To make it, opt_invokebuiltin_delegate_leave
instruction will be changed to opt_invokebuiltin_delegate even if
it is not an event target instruction.
2020-06-26 10:21:56 +09:00
git
289a28e68f * 2020-06-26 [ci skip] 2020-06-26 00:21:39 +09:00
Richard Schneeman
2d89af45ea Add require to Delegator examples
In Ruby 2.7.1 SimpeDelegator cannot be used without requiring `delegate` this PR adds the require to the first example for each class so that devs don't have to hunt for what require to use.
2020-06-25 11:21:13 -04:00
Nobuyoshi Nakada
6fdd5e26c6
Removed duplicate target
While `spec/bundler` and `spec/bundler/` are treated different
targets by GNU make 4, the same target by GNU make 3.  The latter
target, ending with a slash, was to run `test-bundler-parallel`,
instead of `spec/bundler/%`.
2020-06-25 18:21:41 +09:00
Nobuyoshi Nakada
9a78e24f7d
Removed nonsense rubygems_version in input gemspec files
As it is ignored and set at building packages automatically, it is
just nonsense to set in gemspec file for input.
2020-06-25 15:44:56 +09:00
noraj
4eff8a662a
[flori/json] add metadata
9f430a7bba
2020-06-25 15:32:41 +09:00
Hiroshi SHIBATA
1b076ca30d
[flori/json] Gem::Specification#date is set automatically by RubyGems.org.
1920653013
2020-06-25 15:32:41 +09:00
Hiroshi SHIBATA
4dbb10f29f
[flori/json] keyword argument is provided after Ruby 2.0+
78ec5e2bd3
2020-06-25 15:32:40 +09:00
Takashi Kokubun
bb4a2351cb
Do not JIT inline builtin methods
It's probably not worth it because there's nothing we can optimize in
such builtin methods. It's worth JIT only when inlined.
2020-06-24 22:59:34 -07:00
Takashi Kokubun
ab62aa7037
Run a TracePoint test in an insolated process
to prevent a random failure like
http://ci.rvm.jp/results/trunk-random2@phosphorus-docker/3024287
2020-06-24 22:43:14 -07:00
Burdette Lamar
5e860ed4c1
[ci skip] Enhanced RDoc for Array (#3252)
Methods:

    map/collect
    map!/collect!
    values_at
    select/filter
    select!/filter!
2020-06-24 13:31:42 -05:00
Nobuyoshi Nakada
3d8705dcfd
Drop token info for endless method definition
Because it does not have closing `end`.
2020-06-25 01:14:26 +09:00
Nobuyoshi Nakada
419b0596a2
[ripper] added endless method definition event tests 2020-06-25 01:14:18 +09:00
git
5dfe95d10e * 2020-06-25 [ci skip] 2020-06-25 00:20:44 +09:00
Nobuyoshi Nakada
fe82f72951
AST.of needs SCRIPT_LINES__ filled with a newline 2020-06-25 00:14:31 +09:00
Nobuyoshi Nakada
263b941321
[ripper] fix mismatched indentations warning [Bug #16981]
The scanner location has to be set from `lex.ptok` before it is
flushed by dispatching the scanner event.
2020-06-24 19:53:14 +09:00
Nobuyoshi Nakada
7f29e34f35
[ripper] fail unless got warning as expected 2020-06-24 19:52:39 +09:00
Takashi Kokubun
50c63ab38d
Fix a random test failure by TracePoint
A test worker process may already be enabling TracePoint, which results
in changing the insn name in this test.

http://ci.rvm.jp/results/trunk-random0@phosphorus-docker/3022750
2020-06-24 00:29:53 -07:00
Takashi Kokubun
737da8d383
Add another missing cast 2020-06-23 23:57:26 -07:00
Takashi Kokubun
e0037997d9
Include workflow name in a notification of Compilations 2020-06-23 23:56:02 -07:00
Takashi Kokubun
6ecef1199e
Add missing cast 2020-06-23 23:50:31 -07:00
Takashi Kokubun
946e5cc668
Annotate Kernel#class as inline (#3250)
```
$ benchmark-driver -v --rbenv 'before;after;before --jit;after --jit' benchmark/mjit_class.yml --repeat-count=4
before: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) [x86_64-linux]
after: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) [x86_64-linux]
before --jit: ruby 2.8.0dev (2020-06-23T07:09:54Z master 37a2e48d76) +JIT [x86_64-linux]
after --jit: ruby 2.8.0dev (2020-06-23T17:29:56Z inline-class 0ff147c007) +JIT [x86_64-linux]
Calculating -------------------------------------
                         before       after  before --jit  after --jit
    mjit_class(self)    39.219M     40.060M       53.502M      69.202M i/s -     40.000M times in 1.019915s 0.998495s 0.747631s 0.578021s
       mjit_class(1)    39.567M     41.242M       52.100M      68.895M i/s -     40.000M times in 1.010935s 0.969885s 0.767749s 0.580591s

Comparison:
                 mjit_class(self)
         after --jit:  69201690.7 i/s
        before --jit:  53502336.4 i/s - 1.29x  slower
               after:  40060289.1 i/s - 1.73x  slower
              before:  39218939.2 i/s - 1.76x  slower

                    mjit_class(1)
         after --jit:  68895358.6 i/s
        before --jit:  52100353.0 i/s - 1.32x  slower
               after:  41241993.6 i/s - 1.67x  slower
              before:  39567314.0 i/s - 1.74x  slower
```
2020-06-23 23:49:03 -07:00
Takashi Kokubun
3e02cd518f
Trace :return of builtin methods
using opt_invokebuiltin_delegate_leave insn.

Since Ruby 2.7, :return of methods using builtin have not been traced properly.
2020-06-23 23:42:38 -07:00
git
fbb32b1f48 * 2020-06-24 [ci skip] 2020-06-24 15:18:18 +09:00
Masataka Pocke Kuwabara
b71047cca3 Fix RubyVM::AbstractSyntaxTree document
RubyVM::AbstractSyntaxTree is a module actually, but the document says "class".
2020-06-24 15:17:53 +09:00
Burdette Lamar
dc351ff984
[ci skip] Enhanced RDoc for Array (#3237)
Methods:

    #rotate!
    #rotate
    #sort!
    #sort
    #bsearch
    #bsearch_index
2020-06-23 08:58:26 -05:00
Takashi Kokubun
37a2e48d76
Avoid generating opt_send with cfunc cc with JIT
only for opt_nil_p and opt_not.

While vm_method_cfunc_is is used for opt_eq too, many fast paths of it
don't call it. So if it's populated, it should generate opt_send,
regardless of cfunc or not. And again, opt_neq isn't relevant due to the
difference in operands.
So opt_nil_p and opt_not are the only variants using vm_method_cfunc_is
like they use.

```
$ benchmark-driver -v --rbenv 'before2 --jit::ruby --jit;before --jit;after --jit' benchmark/mjit_opt_cc_insns.yml --repeat-count=4
before2 --jit: ruby 2.8.0dev (2020-06-22T08:37:37Z master 3238641750) +JIT [x86_64-linux]
before --jit: ruby 2.8.0dev (2020-06-23T01:01:24Z master 9ce2066209) +JIT [x86_64-linux]
after --jit: ruby 2.8.0dev (2020-06-23T06:58:37Z master 17e9df3157) +JIT [x86_64-linux]
last_commit=Avoid generating opt_send with cfunc cc with JIT
Calculating -------------------------------------
                     before2 --jit  before --jit  after --jit
        mjit_nil?(1)       54.204M       75.536M      75.031M i/s -     40.000M times in 0.737947s 0.529548s 0.533110s
         mjit_not(1)       53.822M       70.921M      71.920M i/s -     40.000M times in 0.743195s 0.564007s 0.556171s
     mjit_eq(1, nil)        7.367M        6.496M       7.331M i/s -      8.000M times in 1.085882s 1.231470s 1.091327s

Comparison:
                     mjit_nil?(1)
        before --jit:  75536059.3 i/s
         after --jit:  75031409.4 i/s - 1.01x  slower
       before2 --jit:  54204431.6 i/s - 1.39x  slower

                      mjit_not(1)
         after --jit:  71920324.1 i/s
        before --jit:  70921063.1 i/s - 1.01x  slower
       before2 --jit:  53821697.6 i/s - 1.34x  slower

                  mjit_eq(1, nil)
       before2 --jit:   7367280.0 i/s
         after --jit:   7330527.4 i/s - 1.01x  slower
        before --jit:   6496302.8 i/s - 1.13x  slower
```
2020-06-23 00:09:54 -07:00
Nobuyoshi Nakada
6aa3aaac05
lldb_cruby.py: show the sign of Bignum [ci skip] 2020-06-23 15:56:59 +09:00
Hiroshi SHIBATA
078e94106d
[ruby/psych] Fixup 05d7e818a6abe3ee1c56b6be92f086647d73141c
4e7794fc2c
2020-06-23 15:26:29 +09:00
Hiroshi SHIBATA
7cdfc2b5fc
[ruby/psych] Bump version strings for header file
68da645c7e
2020-06-23 15:26:29 +09:00
Hiroshi SHIBATA
70a4599869
[ruby/psych] Bump libyaml version to 0.2.5
39996192cc
2020-06-23 15:26:29 +09:00
Jean Boussier
666c077691
[ruby/psych] Fix anchor lookup with symbolized names
ef74fc01e2
2020-06-23 15:26:29 +09:00
Nobuyoshi Nakada
e9adc2f420
Match the output without encoding for localized compilers 2020-06-23 15:05:44 +09:00
Nobuyoshi Nakada
9ce2066209
Improved error messages for mjit option
and default jit-verbose to 1 if no argument.
2020-06-23 10:01:24 +09:00
Nobuyoshi Nakada
c3ba2db48b
Removed execpath argument of path_check_0 as always TRUE now 2020-06-23 10:01:23 +09:00
Nobuyoshi Nakada
61374839e4
Removed fpath_check, no longer used since taint flag was removed 2020-06-23 10:01:23 +09:00
Aaron Patterson
e2d94f61c8 Convert RMoved to a doubly linked list
This commit converts RMoved slots to a doubly linked list. I want to
convert this to a doubly linked list because the read barrier (currently
in development) must remove nodes from the moved list sometimes.
Removing nodes from the list is much easier if the list is doubly
linked.  In addition, we can reuse the list manipulation routines.
2020-06-22 16:27:35 -07:00
Takashi Kokubun
574a4f0217
Skip test_read_body_block_mod for --jit-wait 2020-06-22 10:45:39 -07:00
git
079ed74d69 * 2020-06-23 [ci skip] 2020-06-23 00:31:05 +09:00