Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion compiler/rustc_mir_transform/src/cross_crate_inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions tests/assembly-llvm/breakpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
// CHECK-LABEL: use_bp
// aarch64: brk #0xf000
// x86_64: int3
#[inline(never)]
pub fn use_bp() {
core::arch::breakpoint();
}
1 change: 1 addition & 0 deletions tests/assembly-llvm/simd/reduce-fadd-unordered.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions tests/codegen-llvm/cross-crate-inlining/auxiliary/leaf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
7 changes: 7 additions & 0 deletions tests/codegen-llvm/cross-crate-inlining/leaf-inlining.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
1 change: 1 addition & 0 deletions tests/codegen-llvm/default-visibility.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
Loading