Ignore intrinsic calls in cross-crate-inlining cost model

This commit is contained in:
Ben Kimock 2025-08-26 21:08:03 -04:00
parent 51ff895062
commit ab91a63d40
6 changed files with 25 additions and 1 deletions

View File

@ -135,7 +135,16 @@ impl<'tcx> Visitor<'tcx> for CostChecker<'_, 'tcx> {
}
}
}
TerminatorKind::Call { unwind, .. } => {
TerminatorKind::Call { ref func, unwind, .. } => {
// We track calls because they make our function not a leaf (and in theory, the
// number of calls indicates how likely this function is to perturb other CGUs).
// But intrinsics don't have a body that gets assigned to a CGU, so they are
// ignored.
if let Some((fn_def_id, _)) = func.const_fn_def()
&& self.tcx.has_attr(fn_def_id, sym::rustc_intrinsic)
{
return;
}
self.calls += 1;
if let UnwindAction::Cleanup(_) = unwind {
self.landing_pads += 1;

View File

@ -9,6 +9,7 @@
// CHECK-LABEL: use_bp
// aarch64: brk #0xf000
// x86_64: int3
#[inline(never)]
pub fn use_bp() {
core::arch::breakpoint();
}

View File

@ -16,6 +16,7 @@ use std::simd::*;
// It would emit about an extra fadd, depending on the architecture.
// CHECK-LABEL: reduce_fadd_negative_zero
#[inline(never)]
pub unsafe fn reduce_fadd_negative_zero(v: f32x4) -> f32 {
// x86_64: addps
// x86_64-NEXT: movshdup

View File

@ -18,3 +18,8 @@ pub fn stem_fn() -> String {
fn inner() -> String {
String::from("test")
}
// This function's optimized MIR contains a call, but it is to an intrinsic.
pub fn leaf_with_intrinsic(a: &[u64; 2], b: &[u64; 2]) -> bool {
a == b
}

View File

@ -18,3 +18,10 @@ pub fn stem_outer() -> String {
// CHECK: call {{.*}}stem_fn
leaf::stem_fn()
}
// Check that we inline functions that call intrinsics
#[no_mangle]
pub fn leaf_with_intrinsic_outer(a: &[u64; 2], b: &[u64; 2]) -> bool {
// CHECK-NOT: call {{.*}}leaf_with_intrinsic
leaf::leaf_with_intrinsic(a, b)
}

View File

@ -32,6 +32,7 @@ pub static tested_symbol: [u8; 6] = *b"foobar";
// INTERPOSABLE: @{{.*}}default_visibility{{.*}}tested_symbol{{.*}} = constant
// DEFAULT: @{{.*}}default_visibility{{.*}}tested_symbol{{.*}} = constant
#[inline(never)]
pub fn do_memcmp(left: &[u8], right: &[u8]) -> i32 {
left.cmp(right) as i32
}