diff --git a/library/alloc/Cargo.toml b/library/alloc/Cargo.toml index a1071d2cde5f0..cc73478b80608 100644 --- a/library/alloc/Cargo.toml +++ b/library/alloc/Cargo.toml @@ -22,7 +22,7 @@ compiler_builtins = { path = "../compiler-builtins/compiler-builtins", features compiler-builtins-mem = ['compiler_builtins/mem'] compiler-builtins-c = ["compiler_builtins/c"] # Choose algorithms that are optimized for binary size instead of runtime performance -optimize_for_size = ["core/optimize_for_size"] +optimize_for_size = ["core/optimize_for_size", "compiler_builtins/optimize_for_size"] [lints.rust.unexpected_cfgs] level = "warn" diff --git a/library/compiler-builtins/builtins-shim/Cargo.toml b/library/compiler-builtins/builtins-shim/Cargo.toml index c940723a1ba5f..9ab2eac7f4fae 100644 --- a/library/compiler-builtins/builtins-shim/Cargo.toml +++ b/library/compiler-builtins/builtins-shim/Cargo.toml @@ -65,3 +65,6 @@ unmangled-names = [] # This makes certain traits and function specializations public that # are not normally public but are required by the `builtins-test` unstable-public-internals = [] + +# Choose algorithms that are optimized for binary size instead of runtime performance +optimize_for_size = [] diff --git a/library/compiler-builtins/compiler-builtins/Cargo.toml b/library/compiler-builtins/compiler-builtins/Cargo.toml index b2f1443f2eb09..226ed27eac414 100644 --- a/library/compiler-builtins/compiler-builtins/Cargo.toml +++ b/library/compiler-builtins/compiler-builtins/Cargo.toml @@ -60,3 +60,6 @@ unmangled-names = [] # This makes certain traits and function specializations public that # are not normally public but are required by the `builtins-test` unstable-public-internals = [] + +# Choose algorithms that are optimized for binary size instead of runtime performance +optimize_for_size = ["core/optimize_for_size"] diff --git a/library/compiler-builtins/compiler-builtins/src/mem/impls.rs b/library/compiler-builtins/compiler-builtins/src/mem/impls.rs index c7cfa6fb4618e..e6e2870cfa9b1 100644 --- a/library/compiler-builtins/compiler-builtins/src/mem/impls.rs +++ b/library/compiler-builtins/compiler-builtins/src/mem/impls.rs @@ -199,7 +199,7 @@ pub unsafe fn copy_forward(mut dest: *mut u8, mut src: *const u8, mut n: usize) } } - if n >= WORD_COPY_THRESHOLD { + if !cfg!(feature = "optimize_for_size") && n >= WORD_COPY_THRESHOLD { // Align dest // Because of n >= 2 * WORD_SIZE, dst_misalignment < n let dest_misalignment = (dest as usize).wrapping_neg() & WORD_MASK; @@ -318,7 +318,7 @@ pub unsafe fn copy_backward(dest: *mut u8, src: *const u8, mut n: usize) { let mut dest = dest.wrapping_add(n); let mut src = src.wrapping_add(n); - if n >= WORD_COPY_THRESHOLD { + if !cfg!(feature = "optimize_for_size") && n >= WORD_COPY_THRESHOLD { // Align dest // Because of n >= 2 * WORD_SIZE, dst_misalignment < n let dest_misalignment = dest as usize & WORD_MASK; @@ -371,20 +371,22 @@ pub unsafe fn set_bytes(mut s: *mut u8, c: u8, mut n: usize) { } } - if n >= WORD_COPY_THRESHOLD { - // Align s - // Because of n >= 2 * WORD_SIZE, dst_misalignment < n - let misalignment = (s as usize).wrapping_neg() & WORD_MASK; - set_bytes_bytes(s, c, misalignment); - s = s.wrapping_add(misalignment); - n -= misalignment; - - let n_words = n & !WORD_MASK; - set_bytes_words(s, c, n_words); - s = s.wrapping_add(n_words); - n -= n_words; - } else { - cold_path(); + if !cfg!(feature = "optimize_for_size") { + if n >= WORD_COPY_THRESHOLD { + // Align s + // Because of n >= 2 * WORD_SIZE, dst_misalignment < n + let misalignment = (s as usize).wrapping_neg() & WORD_MASK; + set_bytes_bytes(s, c, misalignment); + s = s.wrapping_add(misalignment); + n -= misalignment; + + let n_words = n & !WORD_MASK; + set_bytes_words(s, c, n_words); + s = s.wrapping_add(n_words); + n -= n_words; + } else { + cold_path(); + } } set_bytes_bytes(s, c, n); }