summaryrefslogtreecommitdiff
path: root/zjit/src
diff options
context:
space:
mode:
Diffstat (limited to 'zjit/src')
-rw-r--r--zjit/src/codegen.rs5
-rw-r--r--zjit/src/stats.rs29
2 files changed, 34 insertions, 0 deletions
diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs
index b8d527fb8d..23631ae6ba 100644
--- a/zjit/src/codegen.rs
+++ b/zjit/src/codegen.rs
@@ -661,6 +661,7 @@ fn gen_patch_point(jit: &mut JITState, asm: &mut Assembler, invariant: &Invarian
/// Lowering for [`Insn::CCall`]. This is a low-level raw call that doesn't know
/// anything about the callee, so handling for e.g. GC safety is dealt with elsewhere.
fn gen_ccall(asm: &mut Assembler, cfun: *const u8, args: Vec<Opnd>) -> lir::Opnd {
+ gen_incr_counter(asm, Counter::inline_cfunc_optimized_send_count);
asm.ccall(cfun, args)
}
@@ -675,6 +676,8 @@ fn gen_ccall_variadic(
cme: *const rb_callable_method_entry_t,
state: &FrameState,
) -> lir::Opnd {
+ gen_incr_counter(asm, Counter::variadic_cfunc_optimized_send_count);
+
gen_prepare_non_leaf_call(jit, asm, state);
let stack_growth = state.stack_size();
@@ -1051,6 +1054,8 @@ fn gen_send_without_block_direct(
args: Vec<Opnd>,
state: &FrameState,
) -> lir::Opnd {
+ gen_incr_counter(asm, Counter::iseq_optimized_send_count);
+
let local_size = unsafe { get_iseq_body_local_table_size(iseq) }.as_usize();
let stack_growth = state.stack_size() + local_size + unsafe { get_iseq_body_stack_max(iseq) }.as_usize();
gen_stack_overflow_check(jit, asm, state, stack_growth);
diff --git a/zjit/src/stats.rs b/zjit/src/stats.rs
index a9cf1bde7c..5c8333d01d 100644
--- a/zjit/src/stats.rs
+++ b/zjit/src/stats.rs
@@ -21,6 +21,9 @@ macro_rules! make_counters {
dynamic_send {
$($dynamic_send_counter_name:ident,)+
}
+ optimized_send {
+ $($optimized_send_counter_name:ident,)+
+ }
$($counter_name:ident,)+
) => {
/// Struct containing the counter values
@@ -29,6 +32,7 @@ macro_rules! make_counters {
$(pub $default_counter_name: u64,)+
$(pub $exit_counter_name: u64,)+
$(pub $dynamic_send_counter_name: u64,)+
+ $(pub $optimized_send_counter_name: u64,)+
$(pub $counter_name: u64,)+
}
@@ -39,6 +43,7 @@ macro_rules! make_counters {
$($default_counter_name,)+
$($exit_counter_name,)+
$($dynamic_send_counter_name,)+
+ $($optimized_send_counter_name,)+
$($counter_name,)+
}
@@ -48,6 +53,7 @@ macro_rules! make_counters {
$( Counter::$default_counter_name => stringify!($default_counter_name).to_string(), )+
$( Counter::$exit_counter_name => stringify!($exit_counter_name).to_string(), )+
$( Counter::$dynamic_send_counter_name => stringify!($dynamic_send_counter_name).to_string(), )+
+ $( Counter::$optimized_send_counter_name => stringify!($optimized_send_counter_name).to_string(), )+
$( Counter::$counter_name => stringify!($counter_name).to_string(), )+
}
}
@@ -60,6 +66,7 @@ macro_rules! make_counters {
$( Counter::$default_counter_name => std::ptr::addr_of_mut!(counters.$default_counter_name), )+
$( Counter::$exit_counter_name => std::ptr::addr_of_mut!(counters.$exit_counter_name), )+
$( Counter::$dynamic_send_counter_name => std::ptr::addr_of_mut!(counters.$dynamic_send_counter_name), )+
+ $( Counter::$optimized_send_counter_name => std::ptr::addr_of_mut!(counters.$optimized_send_counter_name), )+
$( Counter::$counter_name => std::ptr::addr_of_mut!(counters.$counter_name), )+
}
}
@@ -80,6 +87,11 @@ macro_rules! make_counters {
$( Counter::$dynamic_send_counter_name, )+
];
+ /// List of other counters that are summed as optimized_send_count.
+ pub const OPTIMIZED_SEND_COUNTERS: &'static [Counter] = &[
+ $( Counter::$optimized_send_counter_name, )+
+ ];
+
/// List of other counters that are available only for --zjit-stats.
pub const OTHER_COUNTERS: &'static [Counter] = &[
$( Counter::$counter_name, )+
@@ -140,6 +152,13 @@ make_counters! {
send_fallback_not_optimized_instruction,
}
+ // Optimized send counters that are summed as optimized_send_count
+ optimized_send {
+ iseq_optimized_send_count,
+ inline_cfunc_optimized_send_count,
+ variadic_cfunc_optimized_send_count,
+ }
+
// compile_error_: Compile error reasons
compile_error_iseq_stack_too_large,
compile_error_exception_handler,
@@ -421,6 +440,16 @@ pub extern "C" fn rb_zjit_stats(_ec: EcPtr, _self: VALUE, target_key: VALUE) ->
}
set_stat_usize!(hash, "dynamic_send_count", dynamic_send_count);
+ // Set optimized send counters
+ let mut optimized_send_count = 0;
+ for &counter in OPTIMIZED_SEND_COUNTERS {
+ let count = unsafe { *counter_ptr(counter) };
+ optimized_send_count += count;
+ set_stat_usize!(hash, &counter.name(), count);
+ }
+ set_stat_usize!(hash, "optimized_send_count", optimized_send_count);
+ set_stat_usize!(hash, "send_count", dynamic_send_count + optimized_send_count);
+
// Set send fallback counters for NotOptimizedInstruction
let send_fallback_counters = ZJITState::get_send_fallback_counters();
for (op_idx, count) in send_fallback_counters.iter().enumerate().take(VM_INSTRUCTION_SIZE as usize) {