Skip to content

Commit 5f89f02

Browse files
committed
mir: use FiniteBitSet<u32> in polymorphization
This commit changes polymorphization to return a `FiniteBitSet<u32>` rather than a `FiniteBitSet<u64>` because most functions do not use anywhere near sixty-four generic parameters so keeping a `u64` around is unnecessary in most cases. Signed-off-by: David Wood <[email protected]>
1 parent 5f6bd6e commit 5f89f02

File tree

5 files changed

+35
-11
lines changed

5 files changed

+35
-11
lines changed

src/librustc_index/bit_set.rs

+24
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,30 @@ pub trait FiniteBitSetTy:
10341034
fn checked_shr(self, rhs: u32) -> Option<Self>;
10351035
}
10361036

1037+
impl FiniteBitSetTy for u32 {
1038+
const DOMAIN_SIZE: u32 = 32;
1039+
1040+
const FILLED: Self = Self::MAX;
1041+
const EMPTY: Self = Self::MIN;
1042+
1043+
const ONE: Self = 1u32;
1044+
const ZERO: Self = 0u32;
1045+
1046+
fn checked_shl(self, rhs: u32) -> Option<Self> {
1047+
self.checked_shl(rhs)
1048+
}
1049+
1050+
fn checked_shr(self, rhs: u32) -> Option<Self> {
1051+
self.checked_shr(rhs)
1052+
}
1053+
}
1054+
1055+
impl std::fmt::Debug for FiniteBitSet<u32> {
1056+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1057+
write!(f, "{:032b}", self.0)
1058+
}
1059+
}
1060+
10371061
impl FiniteBitSetTy for u64 {
10381062
const DOMAIN_SIZE: u32 = 64;
10391063

src/librustc_metadata/rmeta/decoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1150,7 +1150,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
11501150
.decode((self, tcx))
11511151
}
11521152

1153-
fn get_unused_generic_params(&self, id: DefIndex) -> FiniteBitSet<u64> {
1153+
fn get_unused_generic_params(&self, id: DefIndex) -> FiniteBitSet<u32> {
11541154
self.root
11551155
.tables
11561156
.unused_generic_params

src/librustc_metadata/rmeta/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ define_tables! {
285285
super_predicates: Table<DefIndex, Lazy!(ty::GenericPredicates<'tcx>)>,
286286
mir: Table<DefIndex, Lazy!(mir::Body<'tcx>)>,
287287
promoted_mir: Table<DefIndex, Lazy!(IndexVec<mir::Promoted, mir::Body<'tcx>>)>,
288-
unused_generic_params: Table<DefIndex, Lazy<FiniteBitSet<u64>>>,
288+
unused_generic_params: Table<DefIndex, Lazy<FiniteBitSet<u32>>>,
289289
}
290290

291291
#[derive(Copy, Clone, RustcEncodable, RustcDecodable)]

src/librustc_middle/query/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,7 @@ rustc_queries! {
13191319
query codegen_unit(_: Symbol) -> &'tcx CodegenUnit<'tcx> {
13201320
desc { "codegen_unit" }
13211321
}
1322-
query unused_generic_params(key: DefId) -> FiniteBitSet<u64> {
1322+
query unused_generic_params(key: DefId) -> FiniteBitSet<u32> {
13231323
cache_on_disk_if { key.is_local() }
13241324
desc {
13251325
|tcx| "determining which generic parameters are unused by `{}`",

src/librustc_mir/monomorphize/polymorphize.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub fn provide(providers: &mut Providers) {
2828
/// Determine which generic parameters are used by the function/method/closure represented by
2929
/// `def_id`. Returns a bitset where bits representing unused parameters are set (`is_empty`
3030
/// indicates all parameters are used).
31-
fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u64> {
31+
fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u32> {
3232
debug!("unused_generic_params({:?})", def_id);
3333

3434
if !tcx.sess.opts.debugging_opts.polymorphize {
@@ -53,7 +53,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet<u64> {
5353
// Create a bitset with N rightmost ones for each parameter.
5454
let generics_count: u32 =
5555
generics.count().try_into().expect("more generic parameters than can fit into a `u32`");
56-
let mut unused_parameters = FiniteBitSet::<u64>::new_empty();
56+
let mut unused_parameters = FiniteBitSet::<u32>::new_empty();
5757
unused_parameters.set_range(0..generics_count);
5858
debug!("unused_generic_params: (start) unused_parameters={:?}", unused_parameters);
5959
mark_used_by_default_parameters(tcx, def_id, generics, &mut unused_parameters);
@@ -84,7 +84,7 @@ fn mark_used_by_default_parameters<'tcx>(
8484
tcx: TyCtxt<'tcx>,
8585
def_id: DefId,
8686
generics: &'tcx ty::Generics,
87-
unused_parameters: &mut FiniteBitSet<u64>,
87+
unused_parameters: &mut FiniteBitSet<u32>,
8888
) {
8989
if !tcx.is_trait(def_id) && (tcx.is_closure(def_id) || tcx.type_of(def_id).is_generator()) {
9090
for param in &generics.params {
@@ -110,11 +110,11 @@ fn mark_used_by_default_parameters<'tcx>(
110110
fn mark_used_by_predicates<'tcx>(
111111
tcx: TyCtxt<'tcx>,
112112
def_id: DefId,
113-
unused_parameters: &mut FiniteBitSet<u64>,
113+
unused_parameters: &mut FiniteBitSet<u32>,
114114
) {
115115
let def_id = tcx.closure_base_def_id(def_id);
116116

117-
let is_self_ty_used = |unused_parameters: &mut FiniteBitSet<u64>, self_ty: Ty<'tcx>| {
117+
let is_self_ty_used = |unused_parameters: &mut FiniteBitSet<u32>, self_ty: Ty<'tcx>| {
118118
debug!("unused_generic_params: self_ty={:?}", self_ty);
119119
if let ty::Param(param) = self_ty.kind {
120120
!unused_parameters.contains(param.index).unwrap_or(false)
@@ -123,7 +123,7 @@ fn mark_used_by_predicates<'tcx>(
123123
}
124124
};
125125

126-
let mark_ty = |unused_parameters: &mut FiniteBitSet<u64>, ty: Ty<'tcx>| {
126+
let mark_ty = |unused_parameters: &mut FiniteBitSet<u32>, ty: Ty<'tcx>| {
127127
let mut vis = UsedGenericParametersVisitor { tcx, def_id, unused_parameters };
128128
ty.visit_with(&mut vis);
129129
};
@@ -159,7 +159,7 @@ fn emit_unused_generic_params_error<'tcx>(
159159
tcx: TyCtxt<'tcx>,
160160
def_id: DefId,
161161
generics: &'tcx ty::Generics,
162-
unused_parameters: &FiniteBitSet<u64>,
162+
unused_parameters: &FiniteBitSet<u32>,
163163
) {
164164
debug!("emit_unused_generic_params_error: def_id={:?}", def_id);
165165
let base_def_id = tcx.closure_base_def_id(def_id);
@@ -195,7 +195,7 @@ fn emit_unused_generic_params_error<'tcx>(
195195
struct UsedGenericParametersVisitor<'a, 'tcx> {
196196
tcx: TyCtxt<'tcx>,
197197
def_id: DefId,
198-
unused_parameters: &'a mut FiniteBitSet<u64>,
198+
unused_parameters: &'a mut FiniteBitSet<u32>,
199199
}
200200

201201
impl<'a, 'tcx> Visitor<'tcx> for UsedGenericParametersVisitor<'a, 'tcx> {

0 commit comments

Comments
 (0)