about summary refs log tree commit diff
path: root/library/core
AgeCommit message (Collapse)AuthorLines
2023-02-14Rollup merge of #108023 - JulianKnodt:smaller_benchmark, r=workingjubileeMatthias Krüger-5/+5
Shrink size of array benchmarks Might've overdone it with the size of these benchmarks, as there's no need for them to be quite as large. Fixes #108011
2023-02-14add a `#[rustc_coinductive]` attributelcnr-0/+1
2023-02-14Shrink size of array benchmarkskadmin-5/+5
2023-02-14"Basic usage" is redundant for there is just one exampleTshepang Mbambo-42/+0
2023-02-13fix and extend dropck documentationRalf Jung-11/+71
2023-02-13Auto merge of #107634 - scottmcm:array-drain, r=thomccbors-141/+334
Improve the `array::map` codegen The `map` method on arrays [is documented as sometimes performing poorly](https://doc.rust-lang.org/std/primitive.array.html#note-on-performance-and-stack-usage), and after [a question on URLO](https://users.rust-lang.org/t/try-trait-residual-o-trait-and-try-collect-into-array/88510?u=scottmcm) prompted me to take another look at the core [`try_collect_into_array`](https://github.com/rust-lang/rust/blob/7c46fb2111936ad21a8e3aa41e9128752357f5d8/library/core/src/array/mod.rs#L865-L912) function, I had some ideas that ended up working better than I'd expected. There's three main ideas in here, split over three commits: 1. Don't use `array::IntoIter` when we can avoid it, since that seems to not get SRoA'd, meaning that every step writes things like loop counters into the stack unnecessarily 2. Don't return arrays in `Result`s unnecessarily, as that doesn't seem to optimize away even with `unwrap_unchecked` (perhaps because it needs to get moved into a new LLVM type to account for the discriminant) 3. Don't distract LLVM with all the `Option` dances when we know for sure we have enough items (like in `map` and `zip`). This one's a larger commit as to do it I ended up adding a new `pub(crate)` trait, but hopefully those changes are still straight-forward. (No libs-api changes; everything should be completely implementation-detail-internal.) It's still not completely fixed -- I think it needs pcwalton's `memcpy` optimizations still (#103830) to get further -- but this seems to go much better than before. And the remaining `memcpy`s are just `transmute`-equivalent (`[T; N] -> ManuallyDrop<[T; N]>` and `[MaybeUninit<T>; N] -> [T; N]`), so hopefully those will be easier to remove with LLVM16 than the previous subobject copies 🤞 r? `@thomcc` As a simple example, this test ```rust pub fn long_integer_map(x: [u32; 64]) -> [u32; 64] { x.map(|x| 13 * x + 7) } ``` On nightly <https://rust.godbolt.org/z/xK7548TGj> takes `sub rsp, 808` ```llvm start: %array.i.i.i.i = alloca [64 x i32], align 4 %_3.sroa.5.i.i.i = alloca [65 x i32], align 4 %_5.i = alloca %"core::iter::adapters::map::Map<core::array::iter::IntoIter<u32, 64>, [closure@/app/example.rs:2:11: 2:14]>", align 8 ``` (and yes, that's a 6**5**-element array `alloca` despite 6**4**-element input and output) But with this PR it's only `sub rsp, 520` ```llvm start: %array.i.i.i.i.i.i = alloca [64 x i32], align 4 %array1.i.i.i = alloca %"core::mem::manually_drop::ManuallyDrop<[u32; 64]>", align 4 ``` Similarly, the loop it emits on nightly is scalar-only and horrifying ```nasm .LBB0_1: mov esi, 64 mov edi, 0 cmp rdx, 64 je .LBB0_3 lea rsi, [rdx + 1] mov qword ptr [rsp + 784], rsi mov r8d, dword ptr [rsp + 4*rdx + 528] mov edi, 1 lea edx, [r8 + 2*r8] lea r8d, [r8 + 4*rdx] add r8d, 7 .LBB0_3: test edi, edi je .LBB0_11 mov dword ptr [rsp + 4*rcx + 272], r8d cmp rsi, 64 jne .LBB0_6 xor r8d, r8d mov edx, 64 test r8d, r8d jne .LBB0_8 jmp .LBB0_11 .LBB0_6: lea rdx, [rsi + 1] mov qword ptr [rsp + 784], rdx mov edi, dword ptr [rsp + 4*rsi + 528] mov r8d, 1 lea esi, [rdi + 2*rdi] lea edi, [rdi + 4*rsi] add edi, 7 test r8d, r8d je .LBB0_11 .LBB0_8: mov dword ptr [rsp + 4*rcx + 276], edi add rcx, 2 cmp rcx, 64 jne .LBB0_1 ``` whereas with this PR it's unrolled and vectorized ```nasm vpmulld ymm1, ymm0, ymmword ptr [rsp + 64] vpaddd ymm1, ymm1, ymm2 vmovdqu ymmword ptr [rsp + 328], ymm1 vpmulld ymm1, ymm0, ymmword ptr [rsp + 96] vpaddd ymm1, ymm1, ymm2 vmovdqu ymmword ptr [rsp + 360], ymm1 ``` (though sadly still stack-to-stack)
2023-02-13Auto merge of #107980 - Dylan-DPC:rollup-u4b19bl, r=Dylan-DPCbors-48/+91
Rollup of 7 pull requests Successful merges: - #107654 (reword descriptions of the deprecated int modules) - #107915 (Add `array::map` benchmarks) - #107961 (Avoid copy-pasting the `ilog` panic string in a bunch of places) - #107962 (Add a doc note about why `Chain` is not `ExactSizeIterator`) - #107966 (Update browser-ui-test version to 0.14.3) - #107970 (Hermit: Remove floor symbol) - #107973 (Fix unintentional UB in SIMD tests) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
2023-02-13Inline `Poll` methodsEFanZh-0/+5
2023-02-13Rollup merge of #107962 - scottmcm:why-not-exact, r=Mark-SimulacrumDylan DPC-0/+21
Add a doc note about why `Chain` is not `ExactSizeIterator` Inspired by <https://rust-lang.zulipchat.com/#narrow/stream/122651-general/topic/Why.20isn't.20Chain.3CA.2C.20B.3E.20an.20ExactSizeIterator.3F/near/327395874>.
2023-02-13Rollup merge of #107961 - scottmcm:unify-ilog-panics, r=Mark-SimulacrumDylan DPC-12/+38
Avoid copy-pasting the `ilog` panic string in a bunch of places I also ended up changing the implementations to `if let` because it doesn't work to ```rust self.checked_ilog2().unwrap_or_else(panic_for_nonpositive_argument) ``` due to the `!`. But as a bonus that meant I could remove the `rustc_allow_const_fn_unstable` too.
2023-02-13Rollup merge of #107915 - JulianKnodt:array_benches, r=Mark-SimulacrumDylan DPC-0/+20
Add `array::map` benchmarks Since there were no previous benchmarks for `array::map`, and it is known to have mediocre/poor performance, add some simple benchmarks. These benchmarks vary the length of the array and size of each item.
2023-02-13Rollup merge of #107654 - pitaj:reword-integral-modules, r=thomccDylan DPC-36/+12
reword descriptions of the deprecated int modules Based on recommendation by `@est31` here: https://github.com/rust-lang/rust/pull/107587#issuecomment-1416131590 This is meant to make it more clear, when looking at the `std` or `core` docs, that these are deprecated modules - not deprecated integer types (a common misunderstanding). Before: ![image](https://user-images.githubusercontent.com/803701/216733011-fabc22e1-4e77-4a47-96e3-a765ac4690b6.png) After: ![image](https://user-images.githubusercontent.com/803701/216733660-02071ced-883d-4ab5-8c0a-d28547d1d5db.png)
2023-02-13Auto merge of #107191 - Voultapher:reverse-timsort-scan-direction, r=thomccbors-220/+271
Reverse Timsort scan direction Another PR in the series of stable sort improvements. Best reviewed by looking at the individual commits. The main perf gain here is for fully ascending (sorted) or reversed inputs for cheap to compare types such as `u64`, these see a ~1.5x speedup. ![timsort_evo2_hot_u64_10k](https://user-images.githubusercontent.com/6864584/213913351-cfdf452f-a37c-4bc6-a811-d10c60e66eca.png) ![timsort_evo2_hot_string_10k](https://user-images.githubusercontent.com/6864584/213913354-d9cc395a-2b48-4f54-b687-09174b9e35ce.png) Types such as string with indirect pre-fetching see only minor changes. Further speedups are planned in future PRs so, I wouldn't spend too much time for benchmarks here.
2023-02-12Rollup merge of #107954 - RalfJung:tree-borrows-fix, r=m-ou-seMatthias Krüger-3/+3
avoid mixing accesses of ptrs derived from a mutable ref and parent ptrs ``@Vanille-N`` is working on a successor for Stacked Borrows. It will mostly accept strictly more code than Stacked Borrows did, with one exception: the following pattern no longer works. ```rust let mut root = 6u8; let mref = &mut root; let ptr = mref as *mut u8; *ptr = 0; // Write assert_eq!(root, 0); // Parent Read *ptr = 0; // Attempted Write ``` This worked in Stacked Borrows kind of by accident: when doing the "parent read", under SB we Disable `mref`, but the raw ptrs derived from it remain usable. The fact that we can still use the "children" of a reference that is no longer usable is quite nasty and leads to some undesirable effects (in particular it is the major blocker for resolving https://github.com/rust-lang/unsafe-code-guidelines/issues/257). So in Tree Borrows we no longer do that; instead, reading from `root` makes `mref` and all its children read-only. Due to other improvements in Tree Borrows, the entire Miri test suite still passes with this new behavior, and even the entire libcore and liballoc test suite, except for these 2 cases this PR fixes. Both of these involve code where the programmer wrote `&mut` but then used pointers derived from that reference in ways that alias with the parent pointer, which arguably is violating uniqueness. They are fixed by properly using raw pointers throughout.
2023-02-12Rollup merge of #107943 - compiler-errors:document-pointer-like, r=jyn514Matthias Krüger-1/+4
Document `PointerLike` I forgot to document this, and even though it's currently more of an implementation detail, the old doc was kinda embarrassing :sweat_smile:
2023-02-12Add a doc note about why `Chain` is not `ExactSizeIterator`Scott McMurray-0/+21
2023-02-12avoid mixing accesses of ptrs derived from a mutable ref and parent ptrsRalf Jung-3/+3
2023-02-12Auto merge of #105671 - lukas-code:depreciate-char, r=scottmcmbors-32/+12
Use associated items of `char` instead of freestanding items in `core::char` The associated functions and constants on `char` have been stable since 1.52 and the freestanding items have soft-deprecated since 1.62 (https://github.com/rust-lang/rust/pull/95566). This PR ~~marks them as "deprecated in future", similar to the integer and floating point modules (`core::{i32, f32}` etc)~~ replaces all uses of `core::char::*` with `char::*` to prepare for future deprecation of `core::char::*`.
2023-02-12Auto merge of #107894 - Voultapher:improve-heapsort-fallback, r=scottmcmbors-2/+5
Speedup heapsort by 1.5x by making it branchless `slice::sort_unstable` will fall back to heapsort if it repeatedly fails to find a good pivot. By making the core child update code branchless it is much faster. On Zen3 sorting 10k `u64` and forcing the sort to pick heapsort, results in: 455us -> 278us
2023-02-12Document PointerLikeMichael Goulet-1/+4
2023-02-11Auto merge of #106677 - tbu-:pr_less_doc_hidden_pub, r=scottmcmbors-111/+47
Remove a couple of `#[doc(hidden)] pub fn` and their `#[feature]` gates
2023-02-11Split branches in heapsort child selectionLukas Bergdoll-1/+6
This allows even better code-gen, cmp + adc. While also more clearly communicating the intent.
2023-02-11Add array::map benchmarkskadmin-0/+20
2023-02-10Rename atomic 'as_mut_ptr' to 'as_ptr' to match Cell (ref #66893)Trevor Gross-6/+6
2023-02-10Have a function for the `log(0)` panic, rather than copy-pasting the string ↵Scott McMurray-12/+38
constant
2023-02-10Speedup heapsort by 1.5x by making it branchlessLukas Bergdoll-3/+1
`slice::sort_unstable` will fall back to heapsort if it repeatedly fails to find a good pivot. By making the core child update code branchless it is much faster. On Zen3 sorting 10k `u64` and forcing the sort to pick heapsort, results in: 455us -> 278us
2023-02-09Clarify `new_size` for realloc means bytesJubilee-4/+5
2023-02-10Remove a couple of `#[doc(hidden)] pub fn` and their `#[feature]` gatesTobias Bucher-111/+47
2023-02-09Rollup merge of #107655 - notriddle:notriddle/small-url-encode, r=GuillaumeGomezDylan DPC-3/+3
rustdoc: use the same URL escape rules for fragments as for examples Carries over improvements from #107284
2023-02-08Rollup merge of #107429 - tgross35:from-bytes-until-null-stabilization, ↵Michael Goulet-10/+18
r=dtolnay Stabilize feature `cstr_from_bytes_until_nul` This PR seeks to stabilize `cstr_from_bytes_until_nul`. Partially addresses #95027 This function has only been on nightly for about 10 months, but I think it is simple enough that there isn't harm discussing stabilization. It has also had at least a handful of mentions on both the user forum and the discord, so it seems like it's already in use or at least known. This needs FCP still. Comment on potential discussion points: - eventual conversion of `CStr` to be a single thin pointer: this function will still be useful to provide a safe way to create a `CStr` after this change. - should this return a length too, to address concerns about the `CStr` change? I don't see it as being particularly useful, and it seems less ergonomic (i.e. returning `Result<(&CStr, usize), FromBytesUntilNulError>`). I think users that also need this length without the additional `strlen` call are likely better off using a combination of other methods, but this is up for discussion - `CString::from_vec_until_nul`: this is also useful, but it doesn't even have a nightly implementation merged yet. I propose feature gating that separately, as opposed to blocking this `CStr` implementation on that Possible alternatives: A user can use `from_bytes_with_nul` on a slice up to `my_slice[..my_slice.iter().find(|c| c == 0).unwrap()]`. However; that is significantly less ergonomic, and is a bit more work for the compiler to optimize compared the direct `memchr` call that this wraps. ## New stable API ```rs // both in core::ffi pub struct FromBytesUntilNulError(()); impl CStr { pub const fn from_bytes_until_nul( bytes: &[u8] ) -> Result<&CStr, FromBytesUntilNulError> } ``` cc ```@ericseppanen``` original author, ```@Mark-Simulacrum``` original reviewer, ```@m-ou-se``` brought up some issues on the thin pointer CStr ```@rustbot``` modify labels: +T-libs-api +needs-fcp
2023-02-08Rollup merge of #107769 - compiler-errors:pointer-like, r=eholkMatthias Krüger-5/+6
Rename `PointerSized` to `PointerLike` The old name was unnecessarily vague. This PR renames a nightly language feature that I added, so I don't think it needs any additional approval, though anyone can feel free to speak up if you dislike the rename. It's still unsatisfying that we don't the user which of {size, alignment} is wrong, but this trait really is just a stepping stone for a more generalized mechanism to create `dyn*`, just meant for nightly testing, so I don't think it really deserves additional diagnostic machinery for now. Fixes #107696, cc ``@RalfJung`` r? ``@eholk``
2023-02-07Rename PointerSized to PointerLikeMichael Goulet-5/+6
2023-02-07Rollup merge of #107706 - tgross35:atomic-as-mut-ptr, r=m-ou-seMatthias Krüger-5/+5
Mark 'atomic_mut_ptr' methods const There's nothing that would block these methods from being const (just an UnsafeCell get), and it would be helpful for FFI interfaces in static contexts Related tracking issue: #66893
2023-02-06Rollup merge of #107720 - tshepang:consistency, r=Mark-SimulacrumMatthias Krüger-1/+1
end entry paragraph with a period (.)
2023-02-06Auto merge of #103761 - chenyukang:yukang/fix-103320-must-use, r=compiler-errorsbors-6/+12
Add explanatory message for [#must_use] in ops Fixes #103320
2023-02-06end entry paragprah with a period (.)Tshepang Mbambo-1/+1
2023-02-05Mark 'atomic_mut_ptr' methods constTrevor Gross-5/+5
2023-02-04Allow canonicalizing the `array::map` loop in trusted casesScott McMurray-141/+234
2023-02-04Stop forcing `array::map` through an unnecessary `Result`Scott McMurray-57/+69
2023-02-04Stop using `into_iter` in `array::map`Scott McMurray-11/+99
2023-02-03docs: update fragment for Result implsMichael Howell-3/+3
2023-02-03reword descriptions of the deprecated int modulesPeter Jaszkowiak-36/+12
2023-02-03Rollup merge of #107632 - ameknite:issue-107622-fix, r=jyn514Michael Goulet-2/+4
Clarifying that .map() returns None if None. Fix #107622
2023-02-03Rollup merge of #107551 - fee1-dead-contrib:rm_const_fnmut_helper, r=oli-obkMichael Goulet-120/+21
Replace `ConstFnMutClosure` with const closures Also fixes a parser bug. cc `@oli-obk` for compiler changes
2023-02-03nit fixedAme-1/+1
2023-02-03Clarifying that .map() returns None if None.Ame-2/+4
2023-02-04Fix #103320, add explanatory message for [#must_use]yukang-6/+12
2023-02-03Replace `ConstFnMutClosure` with const closuresDeadbeef-120/+21
2023-02-03Rollup merge of #107598 - chenyukang:yukang/fix-core-bench, r=thomccMatthias Krüger-32/+44
Fix benchmarks in library/core with black_box Fixes #107590
2023-02-03fix #107590, Fix benchmarks in library/core with black_boxyukang-32/+44