From 9104a902c052c1ad7fd5c1245cb1e03f88aa2f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Fri, 11 Sep 2015 16:37:52 +0200 Subject: [PATCH] Avoid triggering a pathological case in the LLVM inliner When the inliner has to decided if it wants to inline a function A into an internal function B, it first checks whether it would be more profitable to inline B into its callees instead. This means that it has to analyze B, which involves checking the assumption cache. Building the assumption cache requires scanning the whole function, and because inlining currently clears the assumption cache, this scan happens again and again, getting even slower as the function grows from inlining. As inlining the huge find functions isn't really useful anyway, we can mark them as noinline, which skips the cost analysis and reduces compile times by as much as 70%. cc #28273 --- src/librustc_platform_intrinsics/aarch64.rs | 1 + src/librustc_platform_intrinsics/arm.rs | 1 + src/librustc_platform_intrinsics/x86.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/src/librustc_platform_intrinsics/aarch64.rs b/src/librustc_platform_intrinsics/aarch64.rs index a3084d903e27..1db5b3cb9ea3 100644 --- a/src/librustc_platform_intrinsics/aarch64.rs +++ b/src/librustc_platform_intrinsics/aarch64.rs @@ -17,6 +17,7 @@ use {Intrinsic, i, i_, u, u_, f, v, v_, agg, p, void}; use IntrinsicDef::Named; use rustc::middle::ty; +#[inline(never)] pub fn find<'tcx>(_tcx: &ty::ctxt<'tcx>, name: &str) -> Option { if !name.starts_with("aarch64_v") { return None } Some(match &name["aarch64_v".len()..] { diff --git a/src/librustc_platform_intrinsics/arm.rs b/src/librustc_platform_intrinsics/arm.rs index 89b147027b5e..eae5c520883d 100644 --- a/src/librustc_platform_intrinsics/arm.rs +++ b/src/librustc_platform_intrinsics/arm.rs @@ -17,6 +17,7 @@ use {Intrinsic, i, i_, u, u_, f, v, agg, p}; use IntrinsicDef::Named; use rustc::middle::ty; +#[inline(never)] pub fn find<'tcx>(_tcx: &ty::ctxt<'tcx>, name: &str) -> Option { if !name.starts_with("arm_v") { return None } Some(match &name["arm_v".len()..] { diff --git a/src/librustc_platform_intrinsics/x86.rs b/src/librustc_platform_intrinsics/x86.rs index 2dfd00e9ce3b..19aeb589e70e 100644 --- a/src/librustc_platform_intrinsics/x86.rs +++ b/src/librustc_platform_intrinsics/x86.rs @@ -17,6 +17,7 @@ use {Intrinsic, i, i_, u, u_, f, v, v_, agg, p, void}; use IntrinsicDef::Named; use rustc::middle::ty; +#[inline(never)] pub fn find<'tcx>(_tcx: &ty::ctxt<'tcx>, name: &str) -> Option { if !name.starts_with("x86_mm") { return None } Some(match &name["x86_mm".len()..] {