-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Cut code size for feature hashing #118348
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -50,6 +50,8 @@ macro_rules! declare_features { | |
}),+ | ||
]; | ||
|
||
const NUM_FEATURES: usize = UNSTABLE_FEATURES.len(); | ||
|
||
/// A set of features to be used by later passes. | ||
#[derive(Clone, Default, Debug)] | ||
pub struct Features { | ||
|
@@ -82,8 +84,14 @@ macro_rules! declare_features { | |
self.declared_features.insert(symbol); | ||
} | ||
|
||
pub fn walk_feature_fields(&self, mut f: impl FnMut(&str, bool)) { | ||
$(f(stringify!($feature), self.$feature);)+ | ||
/// This is intended for hashing the set of active features. | ||
/// | ||
/// The expectation is that this produces much smaller code than other alternatives. | ||
/// | ||
/// Note that the total feature count is pretty small, so this is not a huge array. | ||
#[inline] | ||
pub fn all_features(&self) -> [u8; NUM_FEATURES] { | ||
[$(self.$feature as u8),+] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we don't like this I might look into seeing how painful/annoying it would be to make the tail of the struct be a repr(C) struct that we can cast into |
||
} | ||
|
||
/// Is the given feature explicitly declared, i.e. named in a | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is it better to turn it into a u8 from a bool? Better
HashStable
impl?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, maybe we should add a specialization there as well but [u8] operates in blocks while [bool] will operate one by one. In practice since this is compiling to a loop vs. fully unrolling (what we were doing before this PR afaict) it's not that big a difference but seems like an easy win. Also discourages usage of this array for anything but hashing.