Skip to content

Commit

Permalink
Auto merge of #89069 - bjorn3:optimize_sharded_new, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
Use <[T; N]>::map in Sharded instead of SmallVec and unsafe code

This results in a lot less assembly
  • Loading branch information
bors committed Sep 20, 2021
2 parents db1fb85 + 7b50fd5 commit 3bb9eec
Showing 1 changed file with 1 addition and 19 deletions.
20 changes: 1 addition & 19 deletions compiler/rustc_data_structures/src/sharded.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::fx::{FxHashMap, FxHasher};
use crate::sync::{Lock, LockGuard};
use smallvec::SmallVec;
use std::borrow::Borrow;
use std::collections::hash_map::RawEntryMut;
use std::hash::{Hash, Hasher};
Expand Down Expand Up @@ -37,24 +36,7 @@ impl<T: Default> Default for Sharded<T> {
impl<T> Sharded<T> {
#[inline]
pub fn new(mut value: impl FnMut() -> T) -> Self {
// Create a vector of the values we want
let mut values: SmallVec<[_; SHARDS]> =
(0..SHARDS).map(|_| CacheAligned(Lock::new(value()))).collect();

// Create an uninitialized array
let mut shards: mem::MaybeUninit<[CacheAligned<Lock<T>>; SHARDS]> =
mem::MaybeUninit::uninit();

unsafe {
// Copy the values into our array
let first = shards.as_mut_ptr() as *mut CacheAligned<Lock<T>>;
values.as_ptr().copy_to_nonoverlapping(first, SHARDS);

// Ignore the content of the vector
values.set_len(0);

Sharded { shards: shards.assume_init() }
}
Sharded { shards: [(); SHARDS].map(|()| CacheAligned(Lock::new(value()))) }
}

/// The shard is selected by hashing `val` with `FxHasher`.
Expand Down

0 comments on commit 3bb9eec

Please sign in to comment.