diff options
| author | Nozomi Hijikata <121233810+nozomemein@users.noreply.github.com> | 2026-01-28 04:53:24 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-27 14:53:24 -0500 |
| commit | 6f6ed79a97a2e816a54a1289fd1f33e238ce22c4 (patch) | |
| tree | a199c707bb562b49cd0e8fdc4878b6b475ede3e3 /spec/ruby/core/kernel/__method___spec.rb | |
| parent | 52e71ad4b766d57236e66ebbc419a4447fb0b491 (diff) | |
ZJIT: Compile invokesuperforward (#15958)
Closes: https://github.com/Shopify/ruby/issues/862
Add dynamic dispatch for `invokesuperforward` instruction as a first step.
Specialization like YJIT’s is not implemented yet and will be handled separately.
## Benchmark
### lobsters
<details>
<summary>before patch</summary>
```
Average of last 10, non-warmup iters: 654ms
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (59.5% of total 15,599,811):
Hash#fetch: 3,185,110 (20.4%)
Regexp#match?: 708,802 ( 4.5%)
Hash#key?: 696,422 ( 4.5%)
String#sub!: 489,840 ( 3.1%)
Set#include?: 396,625 ( 2.5%)
String#<<: 396,279 ( 2.5%)
String#start_with?: 379,336 ( 2.4%)
Hash#delete: 325,992 ( 2.1%)
String.new: 307,248 ( 2.0%)
Integer#===: 279,054 ( 1.8%)
Symbol#end_with?: 255,539 ( 1.6%)
Kernel#is_a?: 246,961 ( 1.6%)
Process.clock_gettime: 221,588 ( 1.4%)
Integer#>: 219,718 ( 1.4%)
String#match?: 218,056 ( 1.4%)
Integer#<=: 202,617 ( 1.3%)
Time#to_i: 192,214 ( 1.2%)
Time#subsec: 189,240 ( 1.2%)
String#to_sym: 185,593 ( 1.2%)
String#include?: 182,862 ( 1.2%)
Top-20 calls to C functions from JIT code (83.7% of total 126,406,213):
rb_vm_opt_send_without_block: 37,054,888 (29.3%)
rb_vm_send: 10,068,319 ( 8.0%)
rb_vm_env_write: 8,529,584 ( 6.7%)
rb_hash_aref: 8,014,188 ( 6.3%)
rb_zjit_writebarrier_check_immediate: 7,697,828 ( 6.1%)
rb_vm_getinstancevariable: 5,954,987 ( 4.7%)
rb_ivar_get_at_no_ractor_check: 4,759,191 ( 3.8%)
rb_obj_is_kind_of: 3,722,656 ( 2.9%)
rb_vm_invokesuper: 2,663,433 ( 2.1%)
rb_hash_aset: 2,416,121 ( 1.9%)
rb_vm_setinstancevariable: 2,355,463 ( 1.9%)
rb_vm_opt_getconstant_path: 2,297,784 ( 1.8%)
Hash#fetch: 1,779,524 ( 1.4%)
fetch: 1,405,586 ( 1.1%)
rb_vm_invokeblock: 1,385,970 ( 1.1%)
rb_str_buf_append: 1,369,178 ( 1.1%)
rb_ec_ary_new_from_values: 1,336,805 ( 1.1%)
rb_class_allocate_instance: 1,281,590 ( 1.0%)
rb_hash_new_with_size: 899,859 ( 0.7%)
rb_vm_sendforward: 798,572 ( 0.6%)
Top-2 not optimized method types for send (100.0% of total 4,889,764):
iseq: 4,886,942 (99.9%)
null: 2,822 ( 0.1%)
Top-3 not optimized method types for send_without_block (100.0% of total 525,349):
optimized_send: 478,875 (91.2%)
null: 42,175 ( 8.0%)
optimized_block_call: 4,299 ( 0.8%)
Top-3 not optimized method types for super (100.0% of total 2,350,295):
cfunc: 2,239,567 (95.3%)
alias: 107,374 ( 4.6%)
attrset: 3,354 ( 0.1%)
Top-3 instructions with uncategorized fallback reason (100.0% of total 2,216,938):
invokeblock: 1,385,970 (62.5%)
sendforward: 798,572 (36.0%)
opt_send_without_block: 32,396 ( 1.5%)
Top-20 send fallback reasons (99.9% of total 51,971,182):
send_without_block_polymorphic: 18,639,354 (35.9%)
singleton_class_seen: 9,274,307 (17.8%)
send_without_block_no_profiles: 7,217,551 (13.9%)
send_not_optimized_method_type: 4,889,764 ( 9.4%)
send_no_profiles: 2,882,604 ( 5.5%)
super_not_optimized_method_type: 2,350,295 ( 4.5%)
uncategorized: 2,216,938 ( 4.3%)
one_or_more_complex_arg_pass: 1,543,405 ( 3.0%)
send_without_block_megamorphic: 723,037 ( 1.4%)
send_polymorphic: 544,570 ( 1.0%)
send_without_block_not_optimized_method_type_optimized: 483,174 ( 0.9%)
send_without_block_not_optimized_need_permission: 390,366 ( 0.8%)
too_many_args_for_lir: 312,568 ( 0.6%)
super_complex_args_pass: 111,053 ( 0.2%)
super_target_complex_args_pass: 104,723 ( 0.2%)
super_polymorphic: 87,851 ( 0.2%)
argc_param_mismatch: 50,382 ( 0.1%)
send_without_block_not_optimized_method_type: 42,175 ( 0.1%)
obj_to_string_not_string: 34,861 ( 0.1%)
send_without_block_direct_keyword_mismatch: 32,436 ( 0.1%)
Top-4 setivar fallback reasons (100.0% of total 2,355,463):
not_monomorphic: 2,132,748 (90.5%)
not_t_object: 125,163 ( 5.3%)
too_complex: 97,531 ( 4.1%)
new_shape_needs_extension: 21 ( 0.0%)
Top-2 getivar fallback reasons (100.0% of total 6,080,097):
not_monomorphic: 5,808,527 (95.5%)
too_complex: 271,570 ( 4.5%)
Top-3 definedivar fallback reasons (100.0% of total 405,302):
not_monomorphic: 397,150 (98.0%)
too_complex: 5,122 ( 1.3%)
not_t_object: 3,030 ( 0.7%)
Top-6 invokeblock handler (100.0% of total 1,385,970):
monomorphic_iseq: 688,147 (49.7%)
polymorphic: 523,864 (37.8%)
monomorphic_other: 106,268 ( 7.7%)
monomorphic_ifunc: 55,505 ( 4.0%)
megamorphic: 6,762 ( 0.5%)
no_profiles: 5,424 ( 0.4%)
Top-8 popular complex argument-parameter features not optimized (100.0% of total 1,850,659):
param_forwardable: 685,936 (37.1%)
param_block: 641,355 (34.7%)
param_rest: 327,046 (17.7%)
param_kwrest: 120,210 ( 6.5%)
caller_kw_splat: 36,147 ( 2.0%)
caller_splat: 34,029 ( 1.8%)
caller_blockarg: 5,826 ( 0.3%)
caller_kwarg: 110 ( 0.0%)
Top-1 compile error reasons (100.0% of total 191,769):
exception_handler: 191,769 (100.0%)
Top-6 unhandled YARV insns (100.0% of total 89,278):
invokesuperforward: 81,667 (91.5%)
getconstant: 3,318 ( 3.7%)
setblockparam: 2,837 ( 3.2%)
checkmatch: 929 ( 1.0%)
expandarray: 360 ( 0.4%)
once: 167 ( 0.2%)
Top-3 unhandled HIR insns (100.0% of total 236,976):
throw: 198,481 (83.8%)
invokebuiltin: 35,774 (15.1%)
array_max: 2,721 ( 1.1%)
Top-20 side exit reasons (100.0% of total 15,409,202):
guard_type_failure: 6,871,609 (44.6%)
guard_shape_failure: 6,854,409 (44.5%)
block_param_proxy_not_iseq_or_ifunc: 1,008,346 ( 6.5%)
unhandled_hir_insn: 236,976 ( 1.5%)
compile_error: 191,769 ( 1.2%)
unhandled_yarv_insn: 89,278 ( 0.6%)
fixnum_mult_overflow: 50,739 ( 0.3%)
block_param_proxy_modified: 28,119 ( 0.2%)
patchpoint_stable_constant_names: 19,872 ( 0.1%)
unhandled_newarray_send_pack: 14,481 ( 0.1%)
unhandled_block_arg: 13,787 ( 0.1%)
fixnum_lshift_overflow: 10,085 ( 0.1%)
patchpoint_no_ep_escape: 7,815 ( 0.1%)
expandarray_failure: 4,532 ( 0.0%)
guard_super_method_entry: 4,475 ( 0.0%)
patchpoint_method_redefined: 1,212 ( 0.0%)
patchpoint_no_singleton_class: 1,130 ( 0.0%)
obj_to_string_fallback: 275 ( 0.0%)
guard_less_failure: 163 ( 0.0%)
interrupt: 111 ( 0.0%)
send_count: 152,221,918
dynamic_send_count: 51,971,182 (34.1%)
optimized_send_count: 100,250,736 (65.9%)
dynamic_setivar_count: 2,355,463 ( 1.5%)
dynamic_getivar_count: 6,080,097 ( 4.0%)
dynamic_definedivar_count: 405,302 ( 0.3%)
iseq_optimized_send_count: 40,162,692 (26.4%)
inline_cfunc_optimized_send_count: 40,296,415 (26.5%)
inline_iseq_optimized_send_count: 3,344,046 ( 2.2%)
non_variadic_cfunc_optimized_send_count: 8,915,909 ( 5.9%)
variadic_cfunc_optimized_send_count: 7,531,674 ( 4.9%)
compiled_iseq_count: 5,554
failed_iseq_count: 0
compile_time: 1,779ms
profile_time: 13ms
gc_time: 19ms
invalidation_time: 248ms
vm_write_pc_count: 133,179,978
vm_write_sp_count: 133,179,978
vm_write_locals_count: 129,160,863
vm_write_stack_count: 129,160,863
vm_write_to_parent_iseq_local_count: 693,262
vm_read_from_parent_iseq_local_count: 14,736,626
guard_type_count: 157,425,618
guard_type_exit_ratio: 4.4%
guard_shape_count: 64,005,824
guard_shape_exit_ratio: 10.7%
code_region_bytes: 29,147,136
zjit_alloc_bytes: 44,468,338
total_mem_bytes: 73,615,474
side_exit_count: 15,409,202
total_insn_count: 934,468,730
vm_insn_count: 166,726,703
zjit_insn_count: 767,742,027
ratio_in_zjit: 82.2%
```
</details>
<details>
<summary>after patch</summary>
```
Average of last 10, non-warmup iters: 648ms
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (59.5% of total 15,571,939):
Hash#fetch: 3,185,114 (20.5%)
Regexp#match?: 708,795 ( 4.6%)
Hash#key?: 696,422 ( 4.5%)
String#sub!: 489,841 ( 3.1%)
Set#include?: 396,625 ( 2.5%)
String#<<: 396,279 ( 2.5%)
String#start_with?: 370,465 ( 2.4%)
Hash#delete: 325,992 ( 2.1%)
String.new: 307,248 ( 2.0%)
Integer#===: 277,929 ( 1.8%)
Symbol#end_with?: 255,540 ( 1.6%)
Kernel#is_a?: 246,961 ( 1.6%)
Process.clock_gettime: 221,588 ( 1.4%)
Integer#>: 219,718 ( 1.4%)
String#match?: 218,057 ( 1.4%)
Integer#<=: 202,617 ( 1.3%)
Time#to_i: 192,214 ( 1.2%)
Time#subsec: 189,240 ( 1.2%)
String#to_sym: 185,593 ( 1.2%)
String#include?: 182,863 ( 1.2%)
Top-20 calls to C functions from JIT code (83.7% of total 126,248,940):
rb_vm_opt_send_without_block: 36,875,422 (29.2%)
rb_vm_send: 10,068,311 ( 8.0%)
rb_vm_env_write: 8,529,572 ( 6.8%)
rb_hash_aref: 8,014,184 ( 6.3%)
rb_zjit_writebarrier_check_immediate: 7,697,776 ( 6.1%)
rb_vm_getinstancevariable: 5,934,206 ( 4.7%)
rb_ivar_get_at_no_ractor_check: 4,759,185 ( 3.8%)
rb_obj_is_kind_of: 3,745,913 ( 3.0%)
rb_vm_invokesuper: 2,663,429 ( 2.1%)
rb_hash_aset: 2,416,112 ( 1.9%)
rb_vm_setinstancevariable: 2,361,107 ( 1.9%)
rb_vm_opt_getconstant_path: 2,294,768 ( 1.8%)
Hash#fetch: 1,779,524 ( 1.4%)
fetch: 1,405,590 ( 1.1%)
rb_vm_invokeblock: 1,385,975 ( 1.1%)
rb_str_buf_append: 1,369,179 ( 1.1%)
rb_ec_ary_new_from_values: 1,336,806 ( 1.1%)
rb_class_allocate_instance: 1,281,533 ( 1.0%)
rb_hash_new_with_size: 899,857 ( 0.7%)
rb_vm_sendforward: 798,572 ( 0.6%)
Top-2 not optimized method types for send (100.0% of total 4,889,758):
iseq: 4,886,936 (99.9%)
null: 2,822 ( 0.1%)
Top-3 not optimized method types for send_without_block (100.0% of total 525,350):
optimized_send: 478,875 (91.2%)
null: 42,176 ( 8.0%)
optimized_block_call: 4,299 ( 0.8%)
Top-3 not optimized method types for super (100.0% of total 2,350,289):
cfunc: 2,239,565 (95.3%)
alias: 107,374 ( 4.6%)
attrset: 3,350 ( 0.1%)
Top-4 instructions with uncategorized fallback reason (100.0% of total 2,298,609):
invokeblock: 1,385,975 (60.3%)
sendforward: 798,572 (34.7%)
invokesuperforward: 81,666 ( 3.6%)
opt_send_without_block: 32,396 ( 1.4%)
Top-20 send fallback reasons (99.9% of total 51,873,375):
send_without_block_polymorphic: 18,540,291 (35.7%)
singleton_class_seen: 9,210,394 (17.8%)
send_without_block_no_profiles: 7,202,051 (13.9%)
send_not_optimized_method_type: 4,889,758 ( 9.4%)
send_no_profiles: 2,882,602 ( 5.6%)
super_not_optimized_method_type: 2,350,289 ( 4.5%)
uncategorized: 2,298,609 ( 4.4%)
one_or_more_complex_arg_pass: 1,543,404 ( 3.0%)
send_without_block_megamorphic: 723,037 ( 1.4%)
send_polymorphic: 544,570 ( 1.0%)
send_without_block_not_optimized_method_type_optimized: 483,174 ( 0.9%)
send_without_block_not_optimized_need_permission: 389,384 ( 0.8%)
too_many_args_for_lir: 312,568 ( 0.6%)
super_complex_args_pass: 111,054 ( 0.2%)
super_target_complex_args_pass: 104,723 ( 0.2%)
super_polymorphic: 87,852 ( 0.2%)
argc_param_mismatch: 50,382 ( 0.1%)
send_without_block_not_optimized_method_type: 42,176 ( 0.1%)
obj_to_string_not_string: 34,853 ( 0.1%)
send_without_block_direct_keyword_mismatch: 32,436 ( 0.1%)
Top-4 setivar fallback reasons (100.0% of total 2,361,107):
not_monomorphic: 2,138,392 (90.6%)
not_t_object: 125,163 ( 5.3%)
too_complex: 97,531 ( 4.1%)
new_shape_needs_extension: 21 ( 0.0%)
Top-2 getivar fallback reasons (100.0% of total 6,059,319):
not_monomorphic: 5,787,746 (95.5%)
too_complex: 271,573 ( 4.5%)
Top-3 definedivar fallback reasons (100.0% of total 405,302):
not_monomorphic: 397,150 (98.0%)
too_complex: 5,122 ( 1.3%)
not_t_object: 3,030 ( 0.7%)
Top-6 invokeblock handler (100.0% of total 1,385,975):
monomorphic_iseq: 688,157 (49.7%)
polymorphic: 523,861 (37.8%)
monomorphic_other: 106,268 ( 7.7%)
monomorphic_ifunc: 55,505 ( 4.0%)
megamorphic: 6,760 ( 0.5%)
no_profiles: 5,424 ( 0.4%)
Top-8 popular complex argument-parameter features not optimized (100.0% of total 1,850,658):
param_forwardable: 685,941 (37.1%)
param_block: 641,355 (34.7%)
param_rest: 327,046 (17.7%)
param_kwrest: 120,209 ( 6.5%)
caller_kw_splat: 36,147 ( 2.0%)
caller_splat: 34,029 ( 1.8%)
caller_blockarg: 5,821 ( 0.3%)
caller_kwarg: 110 ( 0.0%)
Top-1 compile error reasons (100.0% of total 191,769):
exception_handler: 191,769 (100.0%)
Top-5 unhandled YARV insns (100.0% of total 7,611):
getconstant: 3,318 (43.6%)
setblockparam: 2,837 (37.3%)
checkmatch: 929 (12.2%)
expandarray: 360 ( 4.7%)
once: 167 ( 2.2%)
Top-3 unhandled HIR insns (100.0% of total 236,976):
throw: 198,481 (83.8%)
invokebuiltin: 35,774 (15.1%)
array_max: 2,721 ( 1.1%)
Top-20 side exit reasons (100.0% of total 15,343,302):
guard_type_failure: 6,886,972 (44.9%)
guard_shape_failure: 6,854,835 (44.7%)
block_param_proxy_not_iseq_or_ifunc: 1,008,346 ( 6.6%)
unhandled_hir_insn: 236,976 ( 1.5%)
compile_error: 191,769 ( 1.2%)
fixnum_mult_overflow: 50,739 ( 0.3%)
block_param_proxy_modified: 28,119 ( 0.2%)
patchpoint_stable_constant_names: 19,858 ( 0.1%)
unhandled_newarray_send_pack: 14,481 ( 0.1%)
unhandled_block_arg: 13,787 ( 0.1%)
fixnum_lshift_overflow: 10,085 ( 0.1%)
patchpoint_no_ep_escape: 7,815 ( 0.1%)
unhandled_yarv_insn: 7,611 ( 0.0%)
expandarray_failure: 4,533 ( 0.0%)
guard_super_method_entry: 4,475 ( 0.0%)
patchpoint_method_redefined: 1,212 ( 0.0%)
patchpoint_no_singleton_class: 1,130 ( 0.0%)
obj_to_string_fallback: 275 ( 0.0%)
guard_less_failure: 163 ( 0.0%)
interrupt: 102 ( 0.0%)
send_count: 152,019,764
dynamic_send_count: 51,873,375 (34.1%)
optimized_send_count: 100,146,389 (65.9%)
dynamic_setivar_count: 2,361,107 ( 1.6%)
dynamic_getivar_count: 6,059,319 ( 4.0%)
dynamic_definedivar_count: 405,302 ( 0.3%)
iseq_optimized_send_count: 40,149,182 (26.4%)
inline_cfunc_optimized_send_count: 40,168,875 (26.4%)
inline_iseq_optimized_send_count: 3,408,619 ( 2.2%)
non_variadic_cfunc_optimized_send_count: 8,896,927 ( 5.9%)
variadic_cfunc_optimized_send_count: 7,522,786 ( 4.9%)
compiled_iseq_count: 5,554
failed_iseq_count: 0
compile_time: 1,784ms
profile_time: 13ms
gc_time: 19ms
invalidation_time: 261ms
vm_write_pc_count: 133,027,580
vm_write_sp_count: 133,027,580
vm_write_locals_count: 129,024,228
vm_write_stack_count: 129,024,228
vm_write_to_parent_iseq_local_count: 693,264
vm_read_from_parent_iseq_local_count: 14,727,716
guard_type_count: 157,500,381
guard_type_exit_ratio: 4.4%
guard_shape_count: 64,160,894
guard_shape_exit_ratio: 10.7%
code_region_bytes: 29,196,288
zjit_alloc_bytes: 44,686,498
total_mem_bytes: 73,882,786
side_exit_count: 15,343,302
total_insn_count: 934,219,385
vm_insn_count: 167,485,651
zjit_insn_count: 766,733,734
ratio_in_zjit: 82.1%
```
</details>
### rails-bench
<details>
<summary>before patch</summary>
```
Average of last 10, non-warmup iters: 1146ms
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (52.4% of total 38,306,776):
Hash#key?: 3,141,619 ( 8.2%)
Regexp#match?: 2,420,225 ( 6.3%)
Hash#fetch: 2,245,557 ( 5.9%)
Integer#===: 1,098,163 ( 2.9%)
Hash#delete: 1,014,375 ( 2.6%)
Array#any?: 1,007,766 ( 2.6%)
String.new: 1,004,713 ( 2.6%)
String#b: 797,913 ( 2.1%)
String#to_sym: 680,943 ( 1.8%)
Array#all?: 650,132 ( 1.7%)
Fiber.current: 649,003 ( 1.7%)
Array#join: 641,038 ( 1.7%)
Array#include?: 613,837 ( 1.6%)
Kernel#Array: 610,311 ( 1.6%)
String#<<: 606,240 ( 1.6%)
Symbol#end_with?: 598,807 ( 1.6%)
String#force_encoding: 593,535 ( 1.5%)
Kernel#dup: 580,051 ( 1.5%)
Array#[]: 562,360 ( 1.5%)
Kernel#respond_to?: 550,441 ( 1.4%)
Top-20 calls to C functions from JIT code (75.5% of total 262,197,810):
rb_vm_opt_send_without_block: 54,534,682 (20.8%)
rb_hash_aref: 22,920,285 ( 8.7%)
rb_vm_env_write: 19,385,633 ( 7.4%)
rb_vm_send: 17,070,477 ( 6.5%)
rb_zjit_writebarrier_check_immediate: 13,780,973 ( 5.3%)
rb_vm_getinstancevariable: 12,379,513 ( 4.7%)
rb_ivar_get_at_no_ractor_check: 12,156,906 ( 4.6%)
rb_vm_invokesuper: 8,086,665 ( 3.1%)
rb_hash_aset: 5,043,536 ( 1.9%)
rb_obj_is_kind_of: 4,431,123 ( 1.7%)
rb_vm_invokeblock: 4,036,483 ( 1.5%)
Hash#key?: 3,141,619 ( 1.2%)
rb_vm_opt_getconstant_path: 3,053,319 ( 1.2%)
rb_class_allocate_instance: 2,878,526 ( 1.1%)
rb_hash_new_with_size: 2,823,745 ( 1.1%)
rb_ec_ary_new_from_values: 2,585,553 ( 1.0%)
rb_str_concat_literals: 2,450,764 ( 0.9%)
Regexp#match?: 2,420,225 ( 0.9%)
rb_obj_alloc: 2,419,171 ( 0.9%)
rb_vm_setinstancevariable: 2,357,067 ( 0.9%)
Top-2 not optimized method types for send (100.0% of total 8,550,760):
iseq: 8,518,289 (99.6%)
optimized: 32,471 ( 0.4%)
Top-2 not optimized method types for send_without_block (100.0% of total 789,641):
optimized_send: 606,885 (76.9%)
null: 182,756 (23.1%)
Top-2 not optimized method types for super (100.0% of total 6,689,859):
cfunc: 6,640,180 (99.3%)
attrset: 49,679 ( 0.7%)
Top-3 instructions with uncategorized fallback reason (100.0% of total 5,962,039):
invokeblock: 4,036,483 (67.7%)
sendforward: 1,871,601 (31.4%)
opt_send_without_block: 53,955 ( 0.9%)
Top-20 send fallback reasons (100.0% of total 85,599,908):
send_without_block_polymorphic: 31,804,276 (37.2%)
send_without_block_no_profiles: 13,349,825 (15.6%)
send_not_optimized_method_type: 8,550,760 (10.0%)
super_not_optimized_method_type: 6,689,859 ( 7.8%)
uncategorized: 5,962,039 ( 7.0%)
send_no_profiles: 5,200,278 ( 6.1%)
one_or_more_complex_arg_pass: 4,198,502 ( 4.9%)
send_polymorphic: 3,318,658 ( 3.9%)
send_without_block_not_optimized_need_permission: 1,274,177 ( 1.5%)
too_many_args_for_lir: 1,139,487 ( 1.3%)
singleton_class_seen: 1,101,973 ( 1.3%)
super_complex_args_pass: 829,842 ( 1.0%)
send_without_block_not_optimized_method_type_optimized: 606,885 ( 0.7%)
send_without_block_megamorphic: 565,874 ( 0.7%)
super_target_complex_args_pass: 414,600 ( 0.5%)
send_without_block_not_optimized_method_type: 182,756 ( 0.2%)
obj_to_string_not_string: 158,141 ( 0.2%)
super_call_with_block: 100,004 ( 0.1%)
send_without_block_direct_keyword_mismatch: 99,588 ( 0.1%)
super_polymorphic: 52,360 ( 0.1%)
Top-2 setivar fallback reasons (100.0% of total 2,357,067):
not_monomorphic: 2,255,283 (95.7%)
not_t_object: 101,784 ( 4.3%)
Top-1 getivar fallback reasons (100.0% of total 12,379,538):
not_monomorphic: 12,379,538 (100.0%)
Top-2 definedivar fallback reasons (100.0% of total 350,548):
not_monomorphic: 350,461 (100.0%)
not_t_object: 87 ( 0.0%)
Top-6 invokeblock handler (100.0% of total 4,036,483):
monomorphic_iseq: 2,189,057 (54.2%)
polymorphic: 1,207,002 (29.9%)
monomorphic_other: 334,248 ( 8.3%)
monomorphic_ifunc: 221,225 ( 5.5%)
megamorphic: 84,439 ( 2.1%)
no_profiles: 512 ( 0.0%)
Top-8 popular complex argument-parameter features not optimized (100.0% of total 5,212,154):
param_forwardable: 1,824,953 (35.0%)
param_block: 1,792,214 (34.4%)
param_rest: 861,894 (16.5%)
caller_splat: 283,669 ( 5.4%)
caller_kw_splat: 248,291 ( 4.8%)
param_kwrest: 200,208 ( 3.8%)
caller_blockarg: 752 ( 0.0%)
caller_kwarg: 173 ( 0.0%)
Top-1 compile error reasons (100.0% of total 391,562):
exception_handler: 391,562 (100.0%)
Top-6 unhandled YARV insns (100.0% of total 1,000,531):
invokesuperforward: 498,993 (49.9%)
getconstant: 400,945 (40.1%)
expandarray: 49,985 ( 5.0%)
setblockparam: 49,972 ( 5.0%)
checkmatch: 480 ( 0.0%)
once: 156 ( 0.0%)
Top-2 unhandled HIR insns (100.0% of total 268,151):
throw: 232,560 (86.7%)
invokebuiltin: 35,591 (13.3%)
Top-19 side exit reasons (100.0% of total 8,709,784):
guard_shape_failure: 2,497,335 (28.7%)
block_param_proxy_not_iseq_or_ifunc: 1,988,408 (22.8%)
guard_type_failure: 1,722,007 (19.8%)
unhandled_yarv_insn: 1,000,531 (11.5%)
compile_error: 391,562 ( 4.5%)
unhandled_newarray_send_pack: 298,017 ( 3.4%)
unhandled_hir_insn: 268,151 ( 3.1%)
patchpoint_method_redefined: 200,632 ( 2.3%)
unhandled_block_arg: 151,295 ( 1.7%)
block_param_proxy_modified: 124,245 ( 1.4%)
guard_less_failure: 50,126 ( 0.6%)
fixnum_lshift_overflow: 9,985 ( 0.1%)
patchpoint_stable_constant_names: 6,350 ( 0.1%)
fixnum_mult_overflow: 570 ( 0.0%)
obj_to_string_fallback: 405 ( 0.0%)
patchpoint_no_ep_escape: 109 ( 0.0%)
interrupt: 42 ( 0.0%)
guard_super_method_entry: 8 ( 0.0%)
guard_greater_eq_failure: 6 ( 0.0%)
send_count: 329,199,237
dynamic_send_count: 85,599,908 (26.0%)
optimized_send_count: 243,599,329 (74.0%)
dynamic_setivar_count: 2,357,067 ( 0.7%)
dynamic_getivar_count: 12,379,538 ( 3.8%)
dynamic_definedivar_count: 350,548 ( 0.1%)
iseq_optimized_send_count: 93,946,576 (28.5%)
inline_cfunc_optimized_send_count: 97,478,983 (29.6%)
inline_iseq_optimized_send_count: 9,138,886 ( 2.8%)
non_variadic_cfunc_optimized_send_count: 25,367,116 ( 7.7%)
variadic_cfunc_optimized_send_count: 17,667,768 ( 5.4%)
compiled_iseq_count: 2,888
failed_iseq_count: 0
compile_time: 876ms
profile_time: 28ms
gc_time: 6ms
invalidation_time: 8ms
vm_write_pc_count: 287,051,837
vm_write_sp_count: 287,051,837
vm_write_locals_count: 273,948,883
vm_write_stack_count: 273,948,883
vm_write_to_parent_iseq_local_count: 1,079,877
vm_read_from_parent_iseq_local_count: 30,814,984
guard_type_count: 310,888,965
guard_type_exit_ratio: 0.6%
guard_shape_count: 108,669,058
guard_shape_exit_ratio: 2.3%
code_region_bytes: 14,352,384
zjit_alloc_bytes: 18,992,674
total_mem_bytes: 33,345,058
side_exit_count: 8,709,784
total_insn_count: 1,705,856,454
vm_insn_count: 122,246,885
zjit_insn_count: 1,583,609,569
ratio_in_zjit: 92.8%
```
</details>
<details>
<summary>after patch</summary>
```
Average of last 10, non-warmup iters: 1072ms
***ZJIT: Printing ZJIT statistics on exit***
Top-20 not inlined C methods (52.5% of total 38,239,504):
Hash#key?: 3,141,619 ( 8.2%)
Regexp#match?: 2,420,215 ( 6.3%)
Hash#fetch: 2,245,557 ( 5.9%)
Integer#===: 1,097,515 ( 2.9%)
Hash#delete: 1,014,375 ( 2.7%)
Array#any?: 1,007,756 ( 2.6%)
String.new: 1,004,713 ( 2.6%)
String#b: 797,913 ( 2.1%)
String#to_sym: 680,943 ( 1.8%)
Array#all?: 650,132 ( 1.7%)
Fiber.current: 649,003 ( 1.7%)
Array#join: 641,038 ( 1.7%)
Array#include?: 613,837 ( 1.6%)
Kernel#Array: 610,311 ( 1.6%)
String#<<: 606,240 ( 1.6%)
Symbol#end_with?: 598,807 ( 1.6%)
String#force_encoding: 593,535 ( 1.6%)
Kernel#dup: 580,051 ( 1.5%)
Array#[]: 562,360 ( 1.5%)
Kernel#respond_to?: 550,441 ( 1.4%)
Top-20 calls to C functions from JIT code (75.4% of total 262,218,592):
rb_vm_opt_send_without_block: 54,249,429 (20.7%)
rb_hash_aref: 22,920,271 ( 8.7%)
rb_vm_env_write: 19,385,609 ( 7.4%)
rb_vm_send: 17,070,463 ( 6.5%)
rb_zjit_writebarrier_check_immediate: 13,780,893 ( 5.3%)
rb_vm_getinstancevariable: 12,322,924 ( 4.7%)
rb_ivar_get_at_no_ractor_check: 12,156,898 ( 4.6%)
rb_vm_invokesuper: 8,086,659 ( 3.1%)
rb_hash_aset: 5,043,532 ( 1.9%)
rb_obj_is_kind_of: 4,474,826 ( 1.7%)
rb_vm_invokeblock: 4,036,471 ( 1.5%)
Hash#key?: 3,141,619 ( 1.2%)
rb_vm_opt_getconstant_path: 3,053,286 ( 1.2%)
rb_class_allocate_instance: 2,878,505 ( 1.1%)
rb_hash_new_with_size: 2,823,748 ( 1.1%)
rb_ec_ary_new_from_values: 2,585,561 ( 1.0%)
rb_str_concat_literals: 2,450,756 ( 0.9%)
Regexp#match?: 2,420,215 ( 0.9%)
rb_obj_alloc: 2,419,146 ( 0.9%)
rb_vm_setinstancevariable: 2,357,065 ( 0.9%)
Top-2 not optimized method types for send (100.0% of total 8,550,755):
iseq: 8,518,284 (99.6%)
optimized: 32,471 ( 0.4%)
Top-2 not optimized method types for send_without_block (100.0% of total 789,641):
optimized_send: 606,885 (76.9%)
null: 182,756 (23.1%)
Top-2 not optimized method types for super (100.0% of total 6,689,853):
cfunc: 6,640,178 (99.3%)
attrset: 49,675 ( 0.7%)
Top-4 instructions with uncategorized fallback reason (100.0% of total 6,461,020):
invokeblock: 4,036,471 (62.5%)
sendforward: 1,871,601 (29.0%)
invokesuperforward: 498,993 ( 7.7%)
opt_send_without_block: 53,955 ( 0.8%)
Top-20 send fallback reasons (100.0% of total 85,813,616):
send_without_block_polymorphic: 31,519,543 (36.7%)
send_without_block_no_profiles: 13,349,751 (15.6%)
send_not_optimized_method_type: 8,550,755 (10.0%)
super_not_optimized_method_type: 6,689,853 ( 7.8%)
uncategorized: 6,461,020 ( 7.5%)
send_no_profiles: 5,200,273 ( 6.1%)
one_or_more_complex_arg_pass: 4,198,498 ( 4.9%)
send_polymorphic: 3,318,658 ( 3.9%)
send_without_block_not_optimized_need_permission: 1,273,739 ( 1.5%)
too_many_args_for_lir: 1,139,487 ( 1.3%)
singleton_class_seen: 1,101,973 ( 1.3%)
super_complex_args_pass: 829,842 ( 1.0%)
send_without_block_not_optimized_method_type_optimized: 606,885 ( 0.7%)
send_without_block_megamorphic: 565,874 ( 0.7%)
super_target_complex_args_pass: 414,600 ( 0.5%)
send_without_block_not_optimized_method_type: 182,756 ( 0.2%)
obj_to_string_not_string: 158,133 ( 0.2%)
super_call_with_block: 100,004 ( 0.1%)
send_without_block_direct_keyword_mismatch: 99,588 ( 0.1%)
super_polymorphic: 52,360 ( 0.1%)
Top-2 setivar fallback reasons (100.0% of total 2,357,065):
not_monomorphic: 2,255,281 (95.7%)
not_t_object: 101,784 ( 4.3%)
Top-1 getivar fallback reasons (100.0% of total 12,322,949):
not_monomorphic: 12,322,949 (100.0%)
Top-2 definedivar fallback reasons (100.0% of total 350,548):
not_monomorphic: 350,461 (100.0%)
not_t_object: 87 ( 0.0%)
Top-6 invokeblock handler (100.0% of total 4,036,471):
monomorphic_iseq: 2,189,045 (54.2%)
polymorphic: 1,207,002 (29.9%)
monomorphic_other: 334,248 ( 8.3%)
monomorphic_ifunc: 221,225 ( 5.5%)
megamorphic: 84,439 ( 2.1%)
no_profiles: 512 ( 0.0%)
Top-8 popular complex argument-parameter features not optimized (100.0% of total 5,212,150):
param_forwardable: 1,824,953 (35.0%)
param_block: 1,792,214 (34.4%)
param_rest: 861,894 (16.5%)
caller_splat: 283,669 ( 5.4%)
caller_kw_splat: 248,291 ( 4.8%)
param_kwrest: 200,208 ( 3.8%)
caller_blockarg: 748 ( 0.0%)
caller_kwarg: 173 ( 0.0%)
Top-1 compile error reasons (100.0% of total 391,562):
exception_handler: 391,562 (100.0%)
Top-5 unhandled YARV insns (100.0% of total 501,538):
getconstant: 400,945 (79.9%)
expandarray: 49,985 (10.0%)
setblockparam: 49,972 (10.0%)
checkmatch: 480 ( 0.1%)
once: 156 ( 0.0%)
Top-2 unhandled HIR insns (100.0% of total 268,152):
throw: 232,560 (86.7%)
invokebuiltin: 35,592 (13.3%)
Top-19 side exit reasons (100.0% of total 8,210,699):
guard_shape_failure: 2,497,552 (30.4%)
block_param_proxy_not_iseq_or_ifunc: 1,988,408 (24.2%)
guard_type_failure: 1,721,809 (21.0%)
unhandled_yarv_insn: 501,538 ( 6.1%)
compile_error: 391,562 ( 4.8%)
unhandled_newarray_send_pack: 298,017 ( 3.6%)
unhandled_hir_insn: 268,152 ( 3.3%)
patchpoint_method_redefined: 200,632 ( 2.4%)
unhandled_block_arg: 151,295 ( 1.8%)
block_param_proxy_modified: 124,245 ( 1.5%)
guard_less_failure: 50,033 ( 0.6%)
fixnum_lshift_overflow: 9,985 ( 0.1%)
patchpoint_stable_constant_names: 6,342 ( 0.1%)
fixnum_mult_overflow: 570 ( 0.0%)
obj_to_string_fallback: 405 ( 0.0%)
patchpoint_no_ep_escape: 109 ( 0.0%)
interrupt: 31 ( 0.0%)
guard_super_method_entry: 8 ( 0.0%)
guard_greater_eq_failure: 6 ( 0.0%)
send_count: 328,805,013
dynamic_send_count: 85,813,616 (26.1%)
optimized_send_count: 242,991,397 (73.9%)
dynamic_setivar_count: 2,357,065 ( 0.7%)
dynamic_getivar_count: 12,322,949 ( 3.7%)
dynamic_definedivar_count: 350,548 ( 0.1%)
iseq_optimized_send_count: 93,990,621 (28.6%)
inline_cfunc_optimized_send_count: 96,851,696 (29.5%)
inline_iseq_optimized_send_count: 9,181,467 ( 2.8%)
non_variadic_cfunc_optimized_send_count: 25,304,458 ( 7.7%)
variadic_cfunc_optimized_send_count: 17,663,155 ( 5.4%)
compiled_iseq_count: 2,886
failed_iseq_count: 0
compile_time: 875ms
profile_time: 27ms
gc_time: 66ms
invalidation_time: 9ms
vm_write_pc_count: 287,186,308
vm_write_sp_count: 287,186,308
vm_write_locals_count: 274,139,228
vm_write_stack_count: 274,139,228
vm_write_to_parent_iseq_local_count: 1,079,877
vm_read_from_parent_iseq_local_count: 30,810,378
guard_type_count: 310,644,961
guard_type_exit_ratio: 0.6%
guard_shape_count: 109,072,242
guard_shape_exit_ratio: 2.3%
code_region_bytes: 14,352,384
zjit_alloc_bytes: 19,186,174
total_mem_bytes: 33,538,558
side_exit_count: 8,210,699
total_insn_count: 1,705,193,555
vm_insn_count: 123,691,343
zjit_insn_count: 1,581,502,212
ratio_in_zjit: 92.7%
```
</details>
Diffstat (limited to 'spec/ruby/core/kernel/__method___spec.rb')
0 files changed, 0 insertions, 0 deletions
