mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-02 10:18:25 +00:00
Ignore intrinsic calls in cross-crate-inlining cost model
This commit is contained in:
parent
51ff895062
commit
ab91a63d40
@ -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;
|
||||
|
@ -9,6 +9,7 @@
|
||||
// CHECK-LABEL: use_bp
|
||||
// aarch64: brk #0xf000
|
||||
// x86_64: int3
|
||||
#[inline(never)]
|
||||
pub fn use_bp() {
|
||||
core::arch::breakpoint();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user