From f05d586cc99ceed0666459603bfe2aa77a2291ab Mon Sep 17 00:00:00 2001 From: Maxime Chevalier-Boisvert Date: Thu, 23 Nov 2023 15:33:43 -0500 Subject: [PATCH] YJIT: record `num_send_cfunc` stat (#9022) * YJIT: record num_send_cfunc stat Also report num_send_known_cfunc as percentage of num_send_cfunc * Rename num_send_known_cfunc => num_send_cfunc_inline Name seems more descriptive of what we do with out custom codegen --- yjit.rb | 3 ++- yjit/src/codegen.rs | 5 +++-- yjit/src/stats.rs | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/yjit.rb b/yjit.rb index 45552ca2ab..8691a43cd6 100644 --- a/yjit.rb +++ b/yjit.rb @@ -304,7 +304,8 @@ module RubyVM::YJIT out.puts "num_send_dynamic: " + format_number_pct(13, stats[:num_send_dynamic], stats[:num_send]) out.puts "num_send_inline: " + format_number_pct(13, stats[:num_send_inline], stats[:num_send]) out.puts "num_send_leaf_builtin: " + format_number_pct(13, stats[:num_send_leaf_builtin], stats[:num_send]) - out.puts "num_send_known_cfunc: " + format_number_pct(13, stats[:num_send_known_cfunc], stats[:num_send]) + out.puts "num_send_cfunc: " + format_number_pct(13, stats[:num_send_cfunc], stats[:num_send]) + out.puts "num_send_cfunc_inline: " + format_number_pct(13, stats[:num_send_cfunc_inline], stats[:num_send_cfunc]) if stats[:num_send_x86_rel32] != 0 || stats[:num_send_x86_reg] != 0 out.puts "num_send_x86_rel32: " + format_number(13, stats[:num_send_x86_rel32]) out.puts "num_send_x86_reg: " + format_number(13, stats[:num_send_x86_reg]) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 1d264ccb49..7846635e71 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -5398,6 +5398,8 @@ fn gen_send_cfunc( return None; } + gen_counter_incr(asm, Counter::num_send_cfunc); + // Delegate to codegen for C methods if we have it. if kw_arg.is_null() && flags & VM_CALL_OPT_SEND == 0 && flags & VM_CALL_ARGS_SPLAT == 0 && (cfunc_argc == -1 || argc == cfunc_argc) { let codegen_p = lookup_cfunc_codegen(unsafe { (*cme).def }); @@ -5405,7 +5407,7 @@ fn gen_send_cfunc( if let Some(known_cfunc_codegen) = codegen_p { if known_cfunc_codegen(jit, asm, ocb, ci, cme, block, argc, recv_known_klass) { assert_eq!(expected_stack_after, asm.ctx.get_stack_size() as i32); - gen_counter_incr(asm, Counter::num_send_known_cfunc); + gen_counter_incr(asm, Counter::num_send_cfunc_inline); // cfunc codegen generated code. Terminate the block so // there isn't multiple calls in the same block. jump_to_next_insn(jit, asm, ocb); @@ -5433,7 +5435,6 @@ fn gen_send_cfunc( argc - kw_arg_num + 1 }; - // If the argument count doesn't match if cfunc_argc >= 0 && cfunc_argc != passed_argc && flags & VM_CALL_ARGS_SPLAT == 0 { gen_counter_incr(asm, Counter::send_cfunc_argc_mismatch); diff --git a/yjit/src/stats.rs b/yjit/src/stats.rs index 4fc1825991..e3b6103299 100644 --- a/yjit/src/stats.rs +++ b/yjit/src/stats.rs @@ -482,7 +482,8 @@ make_counters! { num_send_dynamic, num_send_inline, num_send_leaf_builtin, - num_send_known_cfunc, + num_send_cfunc, + num_send_cfunc_inline, num_getivar_megamorphic, num_setivar_megamorphic,