<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ruby.git/yjit/bindgen/src, branch v4.0.3</title>
<subtitle>The Ruby Programming Language</subtitle>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/'/>
<entry>
<title>YJIT: Support calling bmethods in Ractors</title>
<updated>2025-12-18T21:43:45+00:00</updated>
<author>
<name>John Hawthorn</name>
<email>john@hawthorn.email</email>
</author>
<published>2025-12-17T20:08:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=345ea0c8e18d3ce8fed332137d225769df619f2b'/>
<id>345ea0c8e18d3ce8fed332137d225769df619f2b</id>
<content type='text'>
Co-authored-by: Luke Gruber &lt;luke.gru@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-authored-by: Luke Gruber &lt;luke.gru@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Add codegen for FixnumDiv (#15452)</title>
<updated>2025-12-09T12:41:09+00:00</updated>
<author>
<name>Abrar Habib</name>
<email>86024593+dddictionary@users.noreply.github.com</email>
</author>
<published>2025-12-09T12:41:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=edca81a1bb72a9dc54a37766d2c80790dec13884'/>
<id>edca81a1bb72a9dc54a37766d2c80790dec13884</id>
<content type='text'>
Fixes https://github.com/Shopify/ruby/issues/902

This pull request adds code generation for dividing fixnums.
Testing confirms the normal case, flooring, and side-exiting on division by zero.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Fixes https://github.com/Shopify/ruby/issues/902

This pull request adds code generation for dividing fixnums.
Testing confirms the normal case, flooring, and side-exiting on division by zero.</pre>
</div>
</content>
</entry>
<entry>
<title>YJIT: Fix including stats for ZJIT instructions when ZJIT not in build</title>
<updated>2025-12-05T20:49:25+00:00</updated>
<author>
<name>Alan Wu</name>
<email>XrXr@users.noreply.github.com</email>
</author>
<published>2025-12-04T02:15:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=8132b3d1d8abbe38810a1e268c59b6d49e46d9a1'/>
<id>8132b3d1d8abbe38810a1e268c59b6d49e46d9a1</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Specialize String#&lt;&lt; with Fixnum</title>
<updated>2025-12-01T23:19:26+00:00</updated>
<author>
<name>Max Bernstein</name>
<email>ruby@bernsteinbear.com</email>
</author>
<published>2025-11-25T03:24:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=8aed31103874524395912fb7ffaee88b5e59a9c3'/>
<id>8aed31103874524395912fb7ffaee88b5e59a9c3</id>
<content type='text'>
Append a codepoint.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Append a codepoint.
</pre>
</div>
</content>
</entry>
<entry>
<title>Extract `KW_SPECIFIED_BITS_MAX` for JITs (GH-15039)</title>
<updated>2025-11-18T22:32:11+00:00</updated>
<author>
<name>Jacob</name>
<email>jacob.denbeaux@shopify.com</email>
</author>
<published>2025-11-18T22:32:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=f3f3e76882d01d5e0a006ff731b70053997396e8'/>
<id>f3f3e76882d01d5e0a006ff731b70053997396e8</id>
<content type='text'>
Rename to `VM_KW_SPECIFIED_BITS_MAX` now that it's in `vm_core.h`.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Rename to `VM_KW_SPECIFIED_BITS_MAX` now that it's in `vm_core.h`.</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Fetch Primitive.attr!(leaf) for InvokeBuiltin</title>
<updated>2025-10-23T00:10:14+00:00</updated>
<author>
<name>Max Bernstein</name>
<email>ruby@bernsteinbear.com</email>
</author>
<published>2025-10-22T23:08:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=fa5481bc063fb54bd2735c6253224349419399e7'/>
<id>fa5481bc063fb54bd2735c6253224349419399e7</id>
<content type='text'>
Fix https://github.com/Shopify/ruby/issues/670
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Fix https://github.com/Shopify/ruby/issues/670
</pre>
</div>
</content>
</entry>
<entry>
<title>YJIT: ZJIT: Extract common bindings to jit.c and remove unnamed enums.</title>
<updated>2025-10-21T20:48:45+00:00</updated>
<author>
<name>Alan Wu</name>
<email>XrXr@users.noreply.github.com</email>
</author>
<published>2025-10-20T16:12:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=bb7f3d17edd29ee8ab5504866c5047fd73a78e64'/>
<id>bb7f3d17edd29ee8ab5504866c5047fd73a78e64</id>
<content type='text'>
The type name bindgen picks for anonymous enums creates desync issues on
the bindgen CI checks.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The type name bindgen picks for anonymous enums creates desync issues on
the bindgen CI checks.
</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Implement codegen for FixnumMod (#14857)</title>
<updated>2025-10-20T21:30:48+00:00</updated>
<author>
<name>Max Bernstein</name>
<email>rubybugs@bernsteinbear.com</email>
</author>
<published>2025-10-20T21:30:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=17368234bfd0b37c58a4b694d764d42e2cad8880'/>
<id>17368234bfd0b37c58a4b694d764d42e2cad8880</id>
<content type='text'>
This is mostly to see what happens to the loops-times benchmark.</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is mostly to see what happens to the loops-times benchmark.</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Implement expandarray (#14847)</title>
<updated>2025-10-20T14:55:52+00:00</updated>
<author>
<name>Max Bernstein</name>
<email>rubybugs@bernsteinbear.com</email>
</author>
<published>2025-10-20T14:55:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=fba349e65883b7b9541433f7716e41d27c7e8a69'/>
<id>fba349e65883b7b9541433f7716e41d27c7e8a69</id>
<content type='text'>
Only support the simple case: no splat or rest.

lobsters before:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (60.5% of total 11,039,954):
                               Kernel#is_a?: 1,030,769 ( 9.3%)
                                  String#&lt;&lt;:   851,954 ( 7.7%)
                                   Hash#[]=:   742,941 ( 6.7%)
                              Regexp#match?:   399,894 ( 3.6%)
                              String#empty?:   353,775 ( 3.2%)
                                  Hash#key?:   349,147 ( 3.2%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,528 ( 2.9%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.2%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.1%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.9%)
                        Kernel#block_given?:   181,797 ( 1.6%)
                                 Kernel#dup:   179,341 ( 1.6%)
                             BasicObject#!=:   175,997 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,600 ( 1.5%)
                                  String#==:   157,735 ( 1.4%)
                       Module#clock_gettime:   144,992 ( 1.3%)
Top-20 not annotated C methods (61.4% of total 11,202,087):
                               Kernel#is_a?: 1,212,660 (10.8%)
                                  String#&lt;&lt;:   851,954 ( 7.6%)
                                   Hash#[]=:   743,120 ( 6.6%)
                              Regexp#match?:   399,894 ( 3.6%)
                              String#empty?:   361,013 ( 3.2%)
                                  Hash#key?:   349,147 ( 3.1%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,528 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.1%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   191,666 ( 1.7%)
                                 Kernel#dup:   179,348 ( 1.6%)
                             BasicObject#!=:   176,181 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,634 ( 1.5%)
                                  String#==:   163,667 ( 1.5%)
                       Module#clock_gettime:   144,992 ( 1.3%)
Top-2 not optimized method types for send (100.0% of total 72,318):
  cfunc: 48,055 (66.4%)
   iseq: 24,263 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,523,682):
       iseq: 2,271,936 (50.2%)
    bmethod:   985,636 (21.8%)
  optimized:   949,703 (21.0%)
      alias:   310,747 ( 6.9%)
       null:     5,106 ( 0.1%)
      cfunc:       554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,293,171):
             invokesuper: 2,373,404 (55.3%)
             invokeblock:   811,926 (18.9%)
             sendforward:   505,452 (11.8%)
                  opt_eq:   451,754 (10.5%)
                opt_plus:    74,404 ( 1.7%)
               opt_minus:    36,228 ( 0.8%)
  opt_send_without_block:    21,792 ( 0.5%)
                 opt_neq:     7,231 ( 0.2%)
                opt_mult:     6,752 ( 0.2%)
                  opt_or:     3,753 ( 0.1%)
                  opt_lt:       348 ( 0.0%)
                  opt_ge:        91 ( 0.0%)
                  opt_gt:        36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,530,724):
                send_without_block_polymorphic: 9,722,491 (38.1%)
                              send_no_profiles: 5,894,788 (23.1%)
  send_without_block_not_optimized_method_type: 4,523,682 (17.7%)
                     not_optimized_instruction: 4,293,171 (16.8%)
                send_without_block_no_profiles:   998,746 ( 3.9%)
                send_not_optimized_method_type:    72,318 ( 0.3%)
       send_without_block_cfunc_array_variadic:    15,134 ( 0.1%)
                      obj_to_string_not_string:     9,765 ( 0.0%)
       send_without_block_direct_too_many_args:       629 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 690,950):
         expandarray: 328,490 (47.5%)
        checkkeyword: 190,694 (27.6%)
    getclassvariable:  59,901 ( 8.7%)
  invokesuperforward:  49,503 ( 7.2%)
       getblockparam:  49,119 ( 7.1%)
   opt_duparray_send:  11,978 ( 1.7%)
         getconstant:     952 ( 0.1%)
          checkmatch:     290 ( 0.0%)
                once:      23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,718,636):
  register_spill_on_alloc: 3,418,255 (91.9%)
  register_spill_on_ccall:   182,018 ( 4.9%)
        exception_handler:   118,363 ( 3.2%)
Top-14 side exit reasons (100.0% of total 10,860,385):
                        compile_error: 3,718,636 (34.2%)
                   guard_type_failure: 2,638,926 (24.3%)
                  guard_shape_failure: 1,917,209 (17.7%)
                  unhandled_yarv_insn:   690,950 ( 6.4%)
  block_param_proxy_not_iseq_or_ifunc:   535,789 ( 4.9%)
                      unhandled_kwarg:   455,347 ( 4.2%)
                           patchpoint:   370,476 ( 3.4%)
                unknown_newarray_send:   314,786 ( 2.9%)
                      unhandled_splat:   122,071 ( 1.1%)
                   unhandled_hir_insn:    76,397 ( 0.7%)
           block_param_proxy_modified:    19,193 ( 0.2%)
               obj_to_string_fallback:       566 ( 0.0%)
               guard_type_not_failure:        22 ( 0.0%)
                            interrupt:        17 ( 0.0%)
                             send_count: 62,244,604
                     dynamic_send_count: 25,530,724 (41.0%)
                   optimized_send_count: 36,713,880 (59.0%)
              iseq_optimized_send_count: 18,587,512 (29.9%)
      inline_cfunc_optimized_send_count:  7,086,414 (11.4%)
non_variadic_cfunc_optimized_send_count:  8,375,754 (13.5%)
    variadic_cfunc_optimized_send_count:  2,664,200 ( 4.3%)
dynamic_getivar_count:                        7,365,995
dynamic_setivar_count:                        7,245,005
compiled_iseq_count:                              4,796
failed_iseq_count:                                  447
compile_time:                                     814ms
profile_time:                                       9ms
gc_time:                                            9ms
invalidation_time:                                 72ms
vm_write_pc_count:                           64,156,223
vm_write_sp_count:                           62,812,449
vm_write_locals_count:                       62,812,449
vm_write_stack_count:                        62,812,449
vm_write_to_parent_iseq_local_count:            292,458
vm_read_from_parent_iseq_local_count:         6,599,701
code_region_bytes:                           22,953,984
side_exit_count:                             10,860,385
total_insn_count:                           517,606,340
vm_insn_count:                              162,979,530
zjit_insn_count:                            354,626,810
ratio_in_zjit:                                    68.5%
```

&lt;/details&gt;

lobsters after:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (59.9% of total 11,291,815):
                               Kernel#is_a?: 1,046,269 ( 9.3%)
                                  String#&lt;&lt;:   851,954 ( 7.5%)
                                   Hash#[]=:   743,274 ( 6.6%)
                              Regexp#match?:   399,894 ( 3.5%)
                              String#empty?:   353,775 ( 3.1%)
                                  Hash#key?:   349,147 ( 3.1%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,502 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.0%)
                                String#sub!:   219,579 ( 1.9%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   181,797 ( 1.6%)
                                 Kernel#dup:   179,341 ( 1.6%)
                             BasicObject#!=:   175,997 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,600 ( 1.5%)
                                  String#==:   157,742 ( 1.4%)
Top-20 not annotated C methods (60.9% of total 11,466,928):
                               Kernel#is_a?: 1,239,923 (10.8%)
                                  String#&lt;&lt;:   851,954 ( 7.4%)
                                   Hash#[]=:   743,453 ( 6.5%)
                              Regexp#match?:   399,894 ( 3.5%)
                              String#empty?:   361,013 ( 3.1%)
                                  Hash#key?:   349,147 ( 3.0%)
                         String#start_with?:   334,961 ( 2.9%)
                         Kernel#respond_to?:   316,502 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.0%)
                                String#sub!:   219,579 ( 1.9%)
                             Array#include?:   211,385 ( 1.8%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   191,666 ( 1.7%)
                                 Kernel#dup:   179,348 ( 1.6%)
                             BasicObject#!=:   176,181 ( 1.5%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,634 ( 1.4%)
                                  String#==:   163,674 ( 1.4%)
Top-2 not optimized method types for send (100.0% of total 72,318):
  cfunc: 48,055 (66.4%)
   iseq: 24,263 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,524,016):
       iseq: 2,272,269 (50.2%)
    bmethod:   985,636 (21.8%)
  optimized:   949,704 (21.0%)
      alias:   310,747 ( 6.9%)
       null:     5,106 ( 0.1%)
      cfunc:       554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,294,241):
             invokesuper: 2,375,446 (55.3%)
             invokeblock:   810,955 (18.9%)
             sendforward:   505,451 (11.8%)
                  opt_eq:   451,754 (10.5%)
                opt_plus:    74,404 ( 1.7%)
               opt_minus:    36,228 ( 0.8%)
  opt_send_without_block:    21,792 ( 0.5%)
                 opt_neq:     7,231 ( 0.2%)
                opt_mult:     6,752 ( 0.2%)
                  opt_or:     3,753 ( 0.1%)
                  opt_lt:       348 ( 0.0%)
                  opt_ge:        91 ( 0.0%)
                  opt_gt:        36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,534,542):
                send_without_block_polymorphic: 9,723,469 (38.1%)
                              send_no_profiles: 5,896,023 (23.1%)
  send_without_block_not_optimized_method_type: 4,524,016 (17.7%)
                     not_optimized_instruction: 4,294,241 (16.8%)
                send_without_block_no_profiles:   998,947 ( 3.9%)
                send_not_optimized_method_type:    72,318 ( 0.3%)
       send_without_block_cfunc_array_variadic:    15,134 ( 0.1%)
                      obj_to_string_not_string:     9,765 ( 0.0%)
       send_without_block_direct_too_many_args:       629 ( 0.0%)
Top-8 unhandled YARV insns (100.0% of total 362,460):
        checkkeyword: 190,694 (52.6%)
    getclassvariable:  59,901 (16.5%)
  invokesuperforward:  49,503 (13.7%)
       getblockparam:  49,119 (13.6%)
   opt_duparray_send:  11,978 ( 3.3%)
         getconstant:     952 ( 0.3%)
          checkmatch:     290 ( 0.1%)
                once:      23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,798,744):
  register_spill_on_alloc: 3,495,669 (92.0%)
  register_spill_on_ccall:   184,712 ( 4.9%)
        exception_handler:   118,363 ( 3.1%)
Top-15 side exit reasons (100.0% of total 10,637,319):
                        compile_error: 3,798,744 (35.7%)
                   guard_type_failure: 2,655,504 (25.0%)
                  guard_shape_failure: 1,917,217 (18.0%)
  block_param_proxy_not_iseq_or_ifunc:   535,789 ( 5.0%)
                      unhandled_kwarg:   455,492 ( 4.3%)
                           patchpoint:   370,478 ( 3.5%)
                  unhandled_yarv_insn:   362,460 ( 3.4%)
                unknown_newarray_send:   314,786 ( 3.0%)
                      unhandled_splat:   122,071 ( 1.1%)
                   unhandled_hir_insn:    83,066 ( 0.8%)
           block_param_proxy_modified:    19,193 ( 0.2%)
             guard_int_equals_failure:     1,914 ( 0.0%)
               obj_to_string_fallback:       566 ( 0.0%)
               guard_type_not_failure:        22 ( 0.0%)
                            interrupt:        17 ( 0.0%)
                             send_count: 62,495,067
                     dynamic_send_count: 25,534,542 (40.9%)
                   optimized_send_count: 36,960,525 (59.1%)
              iseq_optimized_send_count: 18,582,072 (29.7%)
      inline_cfunc_optimized_send_count:  7,086,638 (11.3%)
non_variadic_cfunc_optimized_send_count:  8,392,657 (13.4%)
    variadic_cfunc_optimized_send_count:  2,899,158 ( 4.6%)
dynamic_getivar_count:                        7,365,994
dynamic_setivar_count:                        7,248,500
compiled_iseq_count:                              4,780
failed_iseq_count:                                  463
compile_time:                                     816ms
profile_time:                                       9ms
gc_time:                                           11ms
invalidation_time:                                 70ms
vm_write_pc_count:                           64,363,541
vm_write_sp_count:                           63,022,221
vm_write_locals_count:                       63,022,221
vm_write_stack_count:                        63,022,221
vm_write_to_parent_iseq_local_count:            292,458
vm_read_from_parent_iseq_local_count:         6,850,977
code_region_bytes:                           23,019,520
side_exit_count:                             10,637,319
total_insn_count:                           517,303,190
vm_insn_count:                              160,562,103
zjit_insn_count:                            356,741,087
ratio_in_zjit:                                    69.0%
```

&lt;/details&gt;

railsbench before:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (66.1% of total 25,524,934):
                                   Hash#[]=: 1,700,237 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.2%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                               Kernel#is_a?: 1,429,930 ( 5.6%)
                              String#empty?: 1,370,323 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   590,409 ( 2.3%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,771 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-20 not annotated C methods (66.8% of total 25,392,654):
                                   Hash#[]=: 1,700,416 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.2%)
                               Kernel#is_a?: 1,515,672 ( 6.0%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                              String#empty?: 1,370,478 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.9%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   601,115 ( 2.4%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,876 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-2 not optimized method types for send (100.0% of total 186,159):
   iseq: 112,747 (60.6%)
  cfunc:  73,412 (39.4%)
Top-6 not optimized method types for send_without_block (100.0% of total 8,142,248):
       iseq: 3,464,671 (42.6%)
  optimized: 2,632,884 (32.3%)
    bmethod: 1,290,701 (15.9%)
      alias:   706,020 ( 8.7%)
       null:    47,942 ( 0.6%)
      cfunc:        30 ( 0.0%)
Top-11 not optimized instructions (100.0% of total 8,394,873):
             invokesuper: 5,602,274 (66.7%)
             invokeblock: 1,764,936 (21.0%)
             sendforward:   551,832 ( 6.6%)
                  opt_eq:   441,959 ( 5.3%)
                opt_plus:    31,635 ( 0.4%)
  opt_send_without_block:     1,163 ( 0.0%)
                  opt_lt:       372 ( 0.0%)
                opt_mult:       251 ( 0.0%)
                  opt_ge:       193 ( 0.0%)
                 opt_neq:       149 ( 0.0%)
                  opt_or:       109 ( 0.0%)
Top-8 send fallback reasons (100.0% of total 40,748,753):
                send_without_block_polymorphic: 12,933,923 (31.7%)
                              send_no_profiles:  9,033,636 (22.2%)
                     not_optimized_instruction:  8,394,873 (20.6%)
  send_without_block_not_optimized_method_type:  8,142,248 (20.0%)
                send_without_block_no_profiles:  1,839,228 ( 4.5%)
       send_without_block_cfunc_array_variadic:    215,046 ( 0.5%)
                send_not_optimized_method_type:    186,159 ( 0.5%)
                      obj_to_string_not_string:      3,640 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 1,604,456):
    getclassvariable: 458,136 (28.6%)
       getblockparam: 455,921 (28.4%)
        checkkeyword: 265,425 (16.5%)
  invokesuperforward: 239,383 (14.9%)
         expandarray: 137,305 ( 8.6%)
         getconstant:  48,100 ( 3.0%)
          checkmatch:     149 ( 0.0%)
                once:      23 ( 0.0%)
   opt_duparray_send:      14 ( 0.0%)
Top-3 compile error reasons (100.0% of total 5,570,130):
  register_spill_on_alloc: 4,994,130 (89.7%)
        exception_handler:   356,784 ( 6.4%)
  register_spill_on_ccall:   219,216 ( 3.9%)
Top-13 side exit reasons (100.0% of total 12,412,181):
                        compile_error: 5,570,130 (44.9%)
                  unhandled_yarv_insn: 1,604,456 (12.9%)
                  guard_shape_failure: 1,462,872 (11.8%)
                   guard_type_failure:   845,891 ( 6.8%)
  block_param_proxy_not_iseq_or_ifunc:   765,968 ( 6.2%)
                      unhandled_kwarg:   658,341 ( 5.3%)
                           patchpoint:   504,437 ( 4.1%)
                      unhandled_splat:   446,990 ( 3.6%)
                unknown_newarray_send:   332,740 ( 2.7%)
                   unhandled_hir_insn:   160,205 ( 1.3%)
           block_param_proxy_modified:    59,589 ( 0.5%)
               obj_to_string_fallback:       553 ( 0.0%)
                            interrupt:         9 ( 0.0%)
                             send_count: 119,067,587
                     dynamic_send_count:  40,748,753 (34.2%)
                   optimized_send_count:  78,318,834 (65.8%)
              iseq_optimized_send_count:  39,936,542 (33.5%)
      inline_cfunc_optimized_send_count:  12,857,358 (10.8%)
non_variadic_cfunc_optimized_send_count:  19,722,584 (16.6%)
    variadic_cfunc_optimized_send_count:   5,802,350 ( 4.9%)
dynamic_getivar_count:                      10,980,323
dynamic_setivar_count:                      12,962,726
compiled_iseq_count:                             2,531
failed_iseq_count:                                 245
compile_time:                                    414ms
profile_time:                                     21ms
gc_time:                                          33ms
invalidation_time:                                 5ms
vm_write_pc_count:                         129,093,714
vm_write_sp_count:                         126,023,084
vm_write_locals_count:                     126,023,084
vm_write_stack_count:                      126,023,084
vm_write_to_parent_iseq_local_count:           385,461
vm_read_from_parent_iseq_local_count:       11,266,484
code_region_bytes:                          12,156,928
side_exit_count:                            12,412,181
total_insn_count:                          866,780,158
vm_insn_count:                             216,821,134
zjit_insn_count:                           649,959,024
ratio_in_zjit:                                   75.0%
```

&lt;/details&gt;

railsbench after:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (66.0% of total 25,597,895):
                                   Hash#[]=: 1,724,042 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.1%)
                                  String#&lt;&lt;: 1,494,022 ( 5.8%)
                               Kernel#is_a?: 1,429,946 ( 5.6%)
                              String#empty?: 1,370,323 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.2%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   590,699 ( 2.3%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,771 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-20 not annotated C methods (66.7% of total 25,465,615):
                                   Hash#[]=: 1,724,221 ( 6.8%)
                             String#getbyte: 1,572,123 ( 6.2%)
                               Kernel#is_a?: 1,515,688 ( 6.0%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                              String#empty?: 1,370,478 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   601,405 ( 2.4%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,876 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-2 not optimized method types for send (100.0% of total 186,159):
   iseq: 112,747 (60.6%)
  cfunc:  73,412 (39.4%)
Top-6 not optimized method types for send_without_block (100.0% of total 8,142,248):
       iseq: 3,464,671 (42.6%)
  optimized: 2,632,884 (32.3%)
    bmethod: 1,290,701 (15.9%)
      alias:   706,020 ( 8.7%)
       null:    47,942 ( 0.6%)
      cfunc:        30 ( 0.0%)
Top-11 not optimized instructions (100.0% of total 8,442,456):
             invokesuper: 5,649,857 (66.9%)
             invokeblock: 1,764,936 (20.9%)
             sendforward:   551,832 ( 6.5%)
                  opt_eq:   441,959 ( 5.2%)
                opt_plus:    31,635 ( 0.4%)
  opt_send_without_block:     1,163 ( 0.0%)
                  opt_lt:       372 ( 0.0%)
                opt_mult:       251 ( 0.0%)
                  opt_ge:       193 ( 0.0%)
                 opt_neq:       149 ( 0.0%)
                  opt_or:       109 ( 0.0%)
Top-8 send fallback reasons (100.0% of total 40,796,314):
                send_without_block_polymorphic: 12,933,921 (31.7%)
                              send_no_profiles:  9,033,616 (22.1%)
                     not_optimized_instruction:  8,442,456 (20.7%)
  send_without_block_not_optimized_method_type:  8,142,248 (20.0%)
                send_without_block_no_profiles:  1,839,228 ( 4.5%)
       send_without_block_cfunc_array_variadic:    215,046 ( 0.5%)
                send_not_optimized_method_type:    186,159 ( 0.5%)
                      obj_to_string_not_string:      3,640 ( 0.0%)
Top-8 unhandled YARV insns (100.0% of total 1,467,151):
    getclassvariable: 458,136 (31.2%)
       getblockparam: 455,921 (31.1%)
        checkkeyword: 265,425 (18.1%)
  invokesuperforward: 239,383 (16.3%)
         getconstant:  48,100 ( 3.3%)
          checkmatch:     149 ( 0.0%)
                once:      23 ( 0.0%)
   opt_duparray_send:      14 ( 0.0%)
Top-3 compile error reasons (100.0% of total 5,825,923):
  register_spill_on_alloc: 5,225,940 (89.7%)
        exception_handler:   356,784 ( 6.1%)
  register_spill_on_ccall:   243,199 ( 4.2%)
Top-13 side exit reasons (100.0% of total 12,530,763):
                        compile_error: 5,825,923 (46.5%)
                  unhandled_yarv_insn: 1,467,151 (11.7%)
                  guard_shape_failure: 1,462,876 (11.7%)
                   guard_type_failure:   845,913 ( 6.8%)
  block_param_proxy_not_iseq_or_ifunc:   765,968 ( 6.1%)
                      unhandled_kwarg:   658,341 ( 5.3%)
                           patchpoint:   504,437 ( 4.0%)
                      unhandled_splat:   446,990 ( 3.6%)
                unknown_newarray_send:   332,740 ( 2.7%)
                   unhandled_hir_insn:   160,273 ( 1.3%)
           block_param_proxy_modified:    59,589 ( 0.5%)
               obj_to_string_fallback:       553 ( 0.0%)
                            interrupt:         9 ( 0.0%)
                             send_count: 119,163,569
                     dynamic_send_count:  40,796,314 (34.2%)
                   optimized_send_count:  78,367,255 (65.8%)
              iseq_optimized_send_count:  39,911,967 (33.5%)
      inline_cfunc_optimized_send_count:  12,857,393 (10.8%)
non_variadic_cfunc_optimized_send_count:  19,770,401 (16.6%)
    variadic_cfunc_optimized_send_count:   5,827,494 ( 4.9%)
dynamic_getivar_count:                      10,980,323
dynamic_setivar_count:                      12,986,381
compiled_iseq_count:                             2,523
failed_iseq_count:                                 252
compile_time:                                    420ms
profile_time:                                     21ms
gc_time:                                          30ms
invalidation_time:                                 4ms
vm_write_pc_count:                         128,973,665
vm_write_sp_count:                         125,926,968
vm_write_locals_count:                     125,926,968
vm_write_stack_count:                      125,926,968
vm_write_to_parent_iseq_local_count:           385,752
vm_read_from_parent_iseq_local_count:       11,267,766
code_region_bytes:                          12,189,696
side_exit_count:                            12,530,763
total_insn_count:                          866,667,490
vm_insn_count:                             217,813,201
zjit_insn_count:                           648,854,289
ratio_in_zjit:                                   74.9%
```

&lt;/details&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Only support the simple case: no splat or rest.

lobsters before:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (60.5% of total 11,039,954):
                               Kernel#is_a?: 1,030,769 ( 9.3%)
                                  String#&lt;&lt;:   851,954 ( 7.7%)
                                   Hash#[]=:   742,941 ( 6.7%)
                              Regexp#match?:   399,894 ( 3.6%)
                              String#empty?:   353,775 ( 3.2%)
                                  Hash#key?:   349,147 ( 3.2%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,528 ( 2.9%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.2%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.1%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.9%)
                        Kernel#block_given?:   181,797 ( 1.6%)
                                 Kernel#dup:   179,341 ( 1.6%)
                             BasicObject#!=:   175,997 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,600 ( 1.5%)
                                  String#==:   157,735 ( 1.4%)
                       Module#clock_gettime:   144,992 ( 1.3%)
Top-20 not annotated C methods (61.4% of total 11,202,087):
                               Kernel#is_a?: 1,212,660 (10.8%)
                                  String#&lt;&lt;:   851,954 ( 7.6%)
                                   Hash#[]=:   743,120 ( 6.6%)
                              Regexp#match?:   399,894 ( 3.6%)
                              String#empty?:   361,013 ( 3.2%)
                                  Hash#key?:   349,147 ( 3.1%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,528 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.1%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   191,666 ( 1.7%)
                                 Kernel#dup:   179,348 ( 1.6%)
                             BasicObject#!=:   176,181 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,634 ( 1.5%)
                                  String#==:   163,667 ( 1.5%)
                       Module#clock_gettime:   144,992 ( 1.3%)
Top-2 not optimized method types for send (100.0% of total 72,318):
  cfunc: 48,055 (66.4%)
   iseq: 24,263 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,523,682):
       iseq: 2,271,936 (50.2%)
    bmethod:   985,636 (21.8%)
  optimized:   949,703 (21.0%)
      alias:   310,747 ( 6.9%)
       null:     5,106 ( 0.1%)
      cfunc:       554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,293,171):
             invokesuper: 2,373,404 (55.3%)
             invokeblock:   811,926 (18.9%)
             sendforward:   505,452 (11.8%)
                  opt_eq:   451,754 (10.5%)
                opt_plus:    74,404 ( 1.7%)
               opt_minus:    36,228 ( 0.8%)
  opt_send_without_block:    21,792 ( 0.5%)
                 opt_neq:     7,231 ( 0.2%)
                opt_mult:     6,752 ( 0.2%)
                  opt_or:     3,753 ( 0.1%)
                  opt_lt:       348 ( 0.0%)
                  opt_ge:        91 ( 0.0%)
                  opt_gt:        36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,530,724):
                send_without_block_polymorphic: 9,722,491 (38.1%)
                              send_no_profiles: 5,894,788 (23.1%)
  send_without_block_not_optimized_method_type: 4,523,682 (17.7%)
                     not_optimized_instruction: 4,293,171 (16.8%)
                send_without_block_no_profiles:   998,746 ( 3.9%)
                send_not_optimized_method_type:    72,318 ( 0.3%)
       send_without_block_cfunc_array_variadic:    15,134 ( 0.1%)
                      obj_to_string_not_string:     9,765 ( 0.0%)
       send_without_block_direct_too_many_args:       629 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 690,950):
         expandarray: 328,490 (47.5%)
        checkkeyword: 190,694 (27.6%)
    getclassvariable:  59,901 ( 8.7%)
  invokesuperforward:  49,503 ( 7.2%)
       getblockparam:  49,119 ( 7.1%)
   opt_duparray_send:  11,978 ( 1.7%)
         getconstant:     952 ( 0.1%)
          checkmatch:     290 ( 0.0%)
                once:      23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,718,636):
  register_spill_on_alloc: 3,418,255 (91.9%)
  register_spill_on_ccall:   182,018 ( 4.9%)
        exception_handler:   118,363 ( 3.2%)
Top-14 side exit reasons (100.0% of total 10,860,385):
                        compile_error: 3,718,636 (34.2%)
                   guard_type_failure: 2,638,926 (24.3%)
                  guard_shape_failure: 1,917,209 (17.7%)
                  unhandled_yarv_insn:   690,950 ( 6.4%)
  block_param_proxy_not_iseq_or_ifunc:   535,789 ( 4.9%)
                      unhandled_kwarg:   455,347 ( 4.2%)
                           patchpoint:   370,476 ( 3.4%)
                unknown_newarray_send:   314,786 ( 2.9%)
                      unhandled_splat:   122,071 ( 1.1%)
                   unhandled_hir_insn:    76,397 ( 0.7%)
           block_param_proxy_modified:    19,193 ( 0.2%)
               obj_to_string_fallback:       566 ( 0.0%)
               guard_type_not_failure:        22 ( 0.0%)
                            interrupt:        17 ( 0.0%)
                             send_count: 62,244,604
                     dynamic_send_count: 25,530,724 (41.0%)
                   optimized_send_count: 36,713,880 (59.0%)
              iseq_optimized_send_count: 18,587,512 (29.9%)
      inline_cfunc_optimized_send_count:  7,086,414 (11.4%)
non_variadic_cfunc_optimized_send_count:  8,375,754 (13.5%)
    variadic_cfunc_optimized_send_count:  2,664,200 ( 4.3%)
dynamic_getivar_count:                        7,365,995
dynamic_setivar_count:                        7,245,005
compiled_iseq_count:                              4,796
failed_iseq_count:                                  447
compile_time:                                     814ms
profile_time:                                       9ms
gc_time:                                            9ms
invalidation_time:                                 72ms
vm_write_pc_count:                           64,156,223
vm_write_sp_count:                           62,812,449
vm_write_locals_count:                       62,812,449
vm_write_stack_count:                        62,812,449
vm_write_to_parent_iseq_local_count:            292,458
vm_read_from_parent_iseq_local_count:         6,599,701
code_region_bytes:                           22,953,984
side_exit_count:                             10,860,385
total_insn_count:                           517,606,340
vm_insn_count:                              162,979,530
zjit_insn_count:                            354,626,810
ratio_in_zjit:                                    68.5%
```

&lt;/details&gt;

lobsters after:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (59.9% of total 11,291,815):
                               Kernel#is_a?: 1,046,269 ( 9.3%)
                                  String#&lt;&lt;:   851,954 ( 7.5%)
                                   Hash#[]=:   743,274 ( 6.6%)
                              Regexp#match?:   399,894 ( 3.5%)
                              String#empty?:   353,775 ( 3.1%)
                                  Hash#key?:   349,147 ( 3.1%)
                         String#start_with?:   334,961 ( 3.0%)
                         Kernel#respond_to?:   316,502 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.0%)
                                String#sub!:   219,579 ( 1.9%)
                             Array#include?:   211,385 ( 1.9%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   181,797 ( 1.6%)
                                 Kernel#dup:   179,341 ( 1.6%)
                             BasicObject#!=:   175,997 ( 1.6%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,600 ( 1.5%)
                                  String#==:   157,742 ( 1.4%)
Top-20 not annotated C methods (60.9% of total 11,466,928):
                               Kernel#is_a?: 1,239,923 (10.8%)
                                  String#&lt;&lt;:   851,954 ( 7.4%)
                                   Hash#[]=:   743,453 ( 6.5%)
                              Regexp#match?:   399,894 ( 3.5%)
                              String#empty?:   361,013 ( 3.1%)
                                  Hash#key?:   349,147 ( 3.0%)
                         String#start_with?:   334,961 ( 2.9%)
                         Kernel#respond_to?:   316,502 ( 2.8%)
                 ObjectSpace::WeakKeyMap#[]:   238,978 ( 2.1%)
                              TrueClass#===:   235,771 ( 2.1%)
                             FalseClass#===:   231,144 ( 2.0%)
                                String#sub!:   219,579 ( 1.9%)
                             Array#include?:   211,385 ( 1.8%)
                                 Hash#fetch:   204,702 ( 1.8%)
                        Kernel#block_given?:   191,666 ( 1.7%)
                                 Kernel#dup:   179,348 ( 1.6%)
                             BasicObject#!=:   176,181 ( 1.5%)
                                  Class#new:   168,079 ( 1.5%)
                            Kernel#kind_of?:   165,634 ( 1.4%)
                                  String#==:   163,674 ( 1.4%)
Top-2 not optimized method types for send (100.0% of total 72,318):
  cfunc: 48,055 (66.4%)
   iseq: 24,263 (33.6%)
Top-6 not optimized method types for send_without_block (100.0% of total 4,524,016):
       iseq: 2,272,269 (50.2%)
    bmethod:   985,636 (21.8%)
  optimized:   949,704 (21.0%)
      alias:   310,747 ( 6.9%)
       null:     5,106 ( 0.1%)
      cfunc:       554 ( 0.0%)
Top-13 not optimized instructions (100.0% of total 4,294,241):
             invokesuper: 2,375,446 (55.3%)
             invokeblock:   810,955 (18.9%)
             sendforward:   505,451 (11.8%)
                  opt_eq:   451,754 (10.5%)
                opt_plus:    74,404 ( 1.7%)
               opt_minus:    36,228 ( 0.8%)
  opt_send_without_block:    21,792 ( 0.5%)
                 opt_neq:     7,231 ( 0.2%)
                opt_mult:     6,752 ( 0.2%)
                  opt_or:     3,753 ( 0.1%)
                  opt_lt:       348 ( 0.0%)
                  opt_ge:        91 ( 0.0%)
                  opt_gt:        36 ( 0.0%)
Top-9 send fallback reasons (100.0% of total 25,534,542):
                send_without_block_polymorphic: 9,723,469 (38.1%)
                              send_no_profiles: 5,896,023 (23.1%)
  send_without_block_not_optimized_method_type: 4,524,016 (17.7%)
                     not_optimized_instruction: 4,294,241 (16.8%)
                send_without_block_no_profiles:   998,947 ( 3.9%)
                send_not_optimized_method_type:    72,318 ( 0.3%)
       send_without_block_cfunc_array_variadic:    15,134 ( 0.1%)
                      obj_to_string_not_string:     9,765 ( 0.0%)
       send_without_block_direct_too_many_args:       629 ( 0.0%)
Top-8 unhandled YARV insns (100.0% of total 362,460):
        checkkeyword: 190,694 (52.6%)
    getclassvariable:  59,901 (16.5%)
  invokesuperforward:  49,503 (13.7%)
       getblockparam:  49,119 (13.6%)
   opt_duparray_send:  11,978 ( 3.3%)
         getconstant:     952 ( 0.3%)
          checkmatch:     290 ( 0.1%)
                once:      23 ( 0.0%)
Top-3 compile error reasons (100.0% of total 3,798,744):
  register_spill_on_alloc: 3,495,669 (92.0%)
  register_spill_on_ccall:   184,712 ( 4.9%)
        exception_handler:   118,363 ( 3.1%)
Top-15 side exit reasons (100.0% of total 10,637,319):
                        compile_error: 3,798,744 (35.7%)
                   guard_type_failure: 2,655,504 (25.0%)
                  guard_shape_failure: 1,917,217 (18.0%)
  block_param_proxy_not_iseq_or_ifunc:   535,789 ( 5.0%)
                      unhandled_kwarg:   455,492 ( 4.3%)
                           patchpoint:   370,478 ( 3.5%)
                  unhandled_yarv_insn:   362,460 ( 3.4%)
                unknown_newarray_send:   314,786 ( 3.0%)
                      unhandled_splat:   122,071 ( 1.1%)
                   unhandled_hir_insn:    83,066 ( 0.8%)
           block_param_proxy_modified:    19,193 ( 0.2%)
             guard_int_equals_failure:     1,914 ( 0.0%)
               obj_to_string_fallback:       566 ( 0.0%)
               guard_type_not_failure:        22 ( 0.0%)
                            interrupt:        17 ( 0.0%)
                             send_count: 62,495,067
                     dynamic_send_count: 25,534,542 (40.9%)
                   optimized_send_count: 36,960,525 (59.1%)
              iseq_optimized_send_count: 18,582,072 (29.7%)
      inline_cfunc_optimized_send_count:  7,086,638 (11.3%)
non_variadic_cfunc_optimized_send_count:  8,392,657 (13.4%)
    variadic_cfunc_optimized_send_count:  2,899,158 ( 4.6%)
dynamic_getivar_count:                        7,365,994
dynamic_setivar_count:                        7,248,500
compiled_iseq_count:                              4,780
failed_iseq_count:                                  463
compile_time:                                     816ms
profile_time:                                       9ms
gc_time:                                           11ms
invalidation_time:                                 70ms
vm_write_pc_count:                           64,363,541
vm_write_sp_count:                           63,022,221
vm_write_locals_count:                       63,022,221
vm_write_stack_count:                        63,022,221
vm_write_to_parent_iseq_local_count:            292,458
vm_read_from_parent_iseq_local_count:         6,850,977
code_region_bytes:                           23,019,520
side_exit_count:                             10,637,319
total_insn_count:                           517,303,190
vm_insn_count:                              160,562,103
zjit_insn_count:                            356,741,087
ratio_in_zjit:                                    69.0%
```

&lt;/details&gt;

railsbench before:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (66.1% of total 25,524,934):
                                   Hash#[]=: 1,700,237 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.2%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                               Kernel#is_a?: 1,429,930 ( 5.6%)
                              String#empty?: 1,370,323 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   590,409 ( 2.3%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,771 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-20 not annotated C methods (66.8% of total 25,392,654):
                                   Hash#[]=: 1,700,416 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.2%)
                               Kernel#is_a?: 1,515,672 ( 6.0%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                              String#empty?: 1,370,478 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.9%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   601,115 ( 2.4%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,876 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-2 not optimized method types for send (100.0% of total 186,159):
   iseq: 112,747 (60.6%)
  cfunc:  73,412 (39.4%)
Top-6 not optimized method types for send_without_block (100.0% of total 8,142,248):
       iseq: 3,464,671 (42.6%)
  optimized: 2,632,884 (32.3%)
    bmethod: 1,290,701 (15.9%)
      alias:   706,020 ( 8.7%)
       null:    47,942 ( 0.6%)
      cfunc:        30 ( 0.0%)
Top-11 not optimized instructions (100.0% of total 8,394,873):
             invokesuper: 5,602,274 (66.7%)
             invokeblock: 1,764,936 (21.0%)
             sendforward:   551,832 ( 6.6%)
                  opt_eq:   441,959 ( 5.3%)
                opt_plus:    31,635 ( 0.4%)
  opt_send_without_block:     1,163 ( 0.0%)
                  opt_lt:       372 ( 0.0%)
                opt_mult:       251 ( 0.0%)
                  opt_ge:       193 ( 0.0%)
                 opt_neq:       149 ( 0.0%)
                  opt_or:       109 ( 0.0%)
Top-8 send fallback reasons (100.0% of total 40,748,753):
                send_without_block_polymorphic: 12,933,923 (31.7%)
                              send_no_profiles:  9,033,636 (22.2%)
                     not_optimized_instruction:  8,394,873 (20.6%)
  send_without_block_not_optimized_method_type:  8,142,248 (20.0%)
                send_without_block_no_profiles:  1,839,228 ( 4.5%)
       send_without_block_cfunc_array_variadic:    215,046 ( 0.5%)
                send_not_optimized_method_type:    186,159 ( 0.5%)
                      obj_to_string_not_string:      3,640 ( 0.0%)
Top-9 unhandled YARV insns (100.0% of total 1,604,456):
    getclassvariable: 458,136 (28.6%)
       getblockparam: 455,921 (28.4%)
        checkkeyword: 265,425 (16.5%)
  invokesuperforward: 239,383 (14.9%)
         expandarray: 137,305 ( 8.6%)
         getconstant:  48,100 ( 3.0%)
          checkmatch:     149 ( 0.0%)
                once:      23 ( 0.0%)
   opt_duparray_send:      14 ( 0.0%)
Top-3 compile error reasons (100.0% of total 5,570,130):
  register_spill_on_alloc: 4,994,130 (89.7%)
        exception_handler:   356,784 ( 6.4%)
  register_spill_on_ccall:   219,216 ( 3.9%)
Top-13 side exit reasons (100.0% of total 12,412,181):
                        compile_error: 5,570,130 (44.9%)
                  unhandled_yarv_insn: 1,604,456 (12.9%)
                  guard_shape_failure: 1,462,872 (11.8%)
                   guard_type_failure:   845,891 ( 6.8%)
  block_param_proxy_not_iseq_or_ifunc:   765,968 ( 6.2%)
                      unhandled_kwarg:   658,341 ( 5.3%)
                           patchpoint:   504,437 ( 4.1%)
                      unhandled_splat:   446,990 ( 3.6%)
                unknown_newarray_send:   332,740 ( 2.7%)
                   unhandled_hir_insn:   160,205 ( 1.3%)
           block_param_proxy_modified:    59,589 ( 0.5%)
               obj_to_string_fallback:       553 ( 0.0%)
                            interrupt:         9 ( 0.0%)
                             send_count: 119,067,587
                     dynamic_send_count:  40,748,753 (34.2%)
                   optimized_send_count:  78,318,834 (65.8%)
              iseq_optimized_send_count:  39,936,542 (33.5%)
      inline_cfunc_optimized_send_count:  12,857,358 (10.8%)
non_variadic_cfunc_optimized_send_count:  19,722,584 (16.6%)
    variadic_cfunc_optimized_send_count:   5,802,350 ( 4.9%)
dynamic_getivar_count:                      10,980,323
dynamic_setivar_count:                      12,962,726
compiled_iseq_count:                             2,531
failed_iseq_count:                                 245
compile_time:                                    414ms
profile_time:                                     21ms
gc_time:                                          33ms
invalidation_time:                                 5ms
vm_write_pc_count:                         129,093,714
vm_write_sp_count:                         126,023,084
vm_write_locals_count:                     126,023,084
vm_write_stack_count:                      126,023,084
vm_write_to_parent_iseq_local_count:           385,461
vm_read_from_parent_iseq_local_count:       11,266,484
code_region_bytes:                          12,156,928
side_exit_count:                            12,412,181
total_insn_count:                          866,780,158
vm_insn_count:                             216,821,134
zjit_insn_count:                           649,959,024
ratio_in_zjit:                                   75.0%
```

&lt;/details&gt;

railsbench after:

&lt;details&gt;

```
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (66.0% of total 25,597,895):
                                   Hash#[]=: 1,724,042 ( 6.7%)
                             String#getbyte: 1,572,123 ( 6.1%)
                                  String#&lt;&lt;: 1,494,022 ( 5.8%)
                               Kernel#is_a?: 1,429,946 ( 5.6%)
                              String#empty?: 1,370,323 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.2%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   590,699 ( 2.3%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,771 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-20 not annotated C methods (66.7% of total 25,465,615):
                                   Hash#[]=: 1,724,221 ( 6.8%)
                             String#getbyte: 1,572,123 ( 6.2%)
                               Kernel#is_a?: 1,515,688 ( 6.0%)
                                  String#&lt;&lt;: 1,494,022 ( 5.9%)
                              String#empty?: 1,370,478 ( 5.4%)
                              Regexp#match?: 1,235,067 ( 4.8%)
                         Kernel#respond_to?: 1,198,251 ( 4.7%)
                                  Hash#key?: 1,087,406 ( 4.3%)
                             String#setbyte:   810,022 ( 3.2%)
                                  Integer#^:   766,624 ( 3.0%)
                        Kernel#block_given?:   603,613 ( 2.4%)
                                  String#==:   601,405 ( 2.4%)
                                  Class#new:   506,216 ( 2.0%)
                                Hash#delete:   455,288 ( 1.8%)
                             BasicObject#!=:   428,876 ( 1.7%)
                                 Hash#fetch:   408,621 ( 1.6%)
                         String#ascii_only?:   373,915 ( 1.5%)
                 ObjectSpace::WeakKeyMap#[]:   287,957 ( 1.1%)
                               NilClass#===:   277,244 ( 1.1%)
                               Kernel#Array:   269,590 ( 1.1%)
Top-2 not optimized method types for send (100.0% of total 186,159):
   iseq: 112,747 (60.6%)
  cfunc:  73,412 (39.4%)
Top-6 not optimized method types for send_without_block (100.0% of total 8,142,248):
       iseq: 3,464,671 (42.6%)
  optimized: 2,632,884 (32.3%)
    bmethod: 1,290,701 (15.9%)
      alias:   706,020 ( 8.7%)
       null:    47,942 ( 0.6%)
      cfunc:        30 ( 0.0%)
Top-11 not optimized instructions (100.0% of total 8,442,456):
             invokesuper: 5,649,857 (66.9%)
             invokeblock: 1,764,936 (20.9%)
             sendforward:   551,832 ( 6.5%)
                  opt_eq:   441,959 ( 5.2%)
                opt_plus:    31,635 ( 0.4%)
  opt_send_without_block:     1,163 ( 0.0%)
                  opt_lt:       372 ( 0.0%)
                opt_mult:       251 ( 0.0%)
                  opt_ge:       193 ( 0.0%)
                 opt_neq:       149 ( 0.0%)
                  opt_or:       109 ( 0.0%)
Top-8 send fallback reasons (100.0% of total 40,796,314):
                send_without_block_polymorphic: 12,933,921 (31.7%)
                              send_no_profiles:  9,033,616 (22.1%)
                     not_optimized_instruction:  8,442,456 (20.7%)
  send_without_block_not_optimized_method_type:  8,142,248 (20.0%)
                send_without_block_no_profiles:  1,839,228 ( 4.5%)
       send_without_block_cfunc_array_variadic:    215,046 ( 0.5%)
                send_not_optimized_method_type:    186,159 ( 0.5%)
                      obj_to_string_not_string:      3,640 ( 0.0%)
Top-8 unhandled YARV insns (100.0% of total 1,467,151):
    getclassvariable: 458,136 (31.2%)
       getblockparam: 455,921 (31.1%)
        checkkeyword: 265,425 (18.1%)
  invokesuperforward: 239,383 (16.3%)
         getconstant:  48,100 ( 3.3%)
          checkmatch:     149 ( 0.0%)
                once:      23 ( 0.0%)
   opt_duparray_send:      14 ( 0.0%)
Top-3 compile error reasons (100.0% of total 5,825,923):
  register_spill_on_alloc: 5,225,940 (89.7%)
        exception_handler:   356,784 ( 6.1%)
  register_spill_on_ccall:   243,199 ( 4.2%)
Top-13 side exit reasons (100.0% of total 12,530,763):
                        compile_error: 5,825,923 (46.5%)
                  unhandled_yarv_insn: 1,467,151 (11.7%)
                  guard_shape_failure: 1,462,876 (11.7%)
                   guard_type_failure:   845,913 ( 6.8%)
  block_param_proxy_not_iseq_or_ifunc:   765,968 ( 6.1%)
                      unhandled_kwarg:   658,341 ( 5.3%)
                           patchpoint:   504,437 ( 4.0%)
                      unhandled_splat:   446,990 ( 3.6%)
                unknown_newarray_send:   332,740 ( 2.7%)
                   unhandled_hir_insn:   160,273 ( 1.3%)
           block_param_proxy_modified:    59,589 ( 0.5%)
               obj_to_string_fallback:       553 ( 0.0%)
                            interrupt:         9 ( 0.0%)
                             send_count: 119,163,569
                     dynamic_send_count:  40,796,314 (34.2%)
                   optimized_send_count:  78,367,255 (65.8%)
              iseq_optimized_send_count:  39,911,967 (33.5%)
      inline_cfunc_optimized_send_count:  12,857,393 (10.8%)
non_variadic_cfunc_optimized_send_count:  19,770,401 (16.6%)
    variadic_cfunc_optimized_send_count:   5,827,494 ( 4.9%)
dynamic_getivar_count:                      10,980,323
dynamic_setivar_count:                      12,986,381
compiled_iseq_count:                             2,523
failed_iseq_count:                                 252
compile_time:                                    420ms
profile_time:                                     21ms
gc_time:                                          30ms
invalidation_time:                                 4ms
vm_write_pc_count:                         128,973,665
vm_write_sp_count:                         125,926,968
vm_write_locals_count:                     125,926,968
vm_write_stack_count:                      125,926,968
vm_write_to_parent_iseq_local_count:           385,752
vm_read_from_parent_iseq_local_count:       11,267,766
code_region_bytes:                          12,189,696
side_exit_count:                            12,530,763
total_insn_count:                          866,667,490
vm_insn_count:                             217,813,201
zjit_insn_count:                           648,854,289
ratio_in_zjit:                                   74.9%
```

&lt;/details&gt;</pre>
</div>
</content>
</entry>
<entry>
<title>ZJIT: Share more code with YJIT in jit.c (#14520)</title>
<updated>2025-09-12T20:34:55+00:00</updated>
<author>
<name>Takashi Kokubun</name>
<email>takashi.kokubun@shopify.com</email>
</author>
<published>2025-09-12T20:34:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=d3cb347a40ef789f37f5a4723ecb3ada7e8605a9'/>
<id>d3cb347a40ef789f37f5a4723ecb3ada7e8605a9</id>
<content type='text'>
* ZJIT: Share more code with YJIT in jit.c

* Fix ZJIT references to JIT</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* ZJIT: Share more code with YJIT in jit.c

* Fix ZJIT references to JIT</pre>
</div>
</content>
</entry>
</feed>
