From 7cb427ef3b8ef026bb83d391e843e15b4ea3f13a Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sun, 19 Sep 2021 18:06:38 -0400 Subject: [PATCH] Don't serialize empty predicates to metadata This keeps empty predicates out of the metadata. In practice, it seems like it is quite common to have a default predicate set, so this should be a win. --- compiler/rustc_metadata/src/rmeta/decoder.rs | 7 ++++++- compiler/rustc_metadata/src/rmeta/encoder.rs | 7 ++++++- compiler/rustc_metadata/src/rmeta/mod.rs | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index eb3a9f576a735..453b07965a699 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -919,7 +919,12 @@ impl<'a, 'tcx> CrateMetadataRef<'a> { item_id: DefIndex, tcx: TyCtxt<'tcx>, ) -> ty::GenericPredicates<'tcx> { - self.root.tables.explicit_predicates.get(self, item_id).unwrap().decode((self, tcx)) + self.root + .tables + .explicit_predicates + .get(self, item_id) + .map(|e| e.decode((self, tcx))) + .unwrap_or_default() } fn get_inferred_outlives( diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index a50c4549d3d3f..abee368bbf987 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -992,7 +992,12 @@ impl EncodeContext<'a, 'tcx> { if should_encode_generics(def_kind) { let g = tcx.generics_of(def_id); record!(self.tables.generics[def_id] <- g); - record!(self.tables.explicit_predicates[def_id] <- self.tcx.explicit_predicates_of(def_id)); + let predicates = self.tcx.explicit_predicates_of(def_id); + if let ty::GenericPredicates { parent: None, predicates: &[] } = predicates { + // do nothing -- missing entry indicates empty predicates + } else { + record!(self.tables.explicit_predicates[def_id] <- predicates); + } let inferred_outlives = self.tcx.inferred_outlives_of(def_id); if !inferred_outlives.is_empty() { record!(self.tables.inferred_outlives[def_id] <- inferred_outlives); diff --git a/compiler/rustc_metadata/src/rmeta/mod.rs b/compiler/rustc_metadata/src/rmeta/mod.rs index eb2bd80f46e64..be79998f215ba 100644 --- a/compiler/rustc_metadata/src/rmeta/mod.rs +++ b/compiler/rustc_metadata/src/rmeta/mod.rs @@ -301,6 +301,7 @@ define_tables! { inherent_impls: Table>, variances: Table>, generics: Table>, + // Empty entry indicates default predicates -- quite common in practice. explicit_predicates: Table)>, expn_that_defined: Table>, // As an optimization, a missing entry indicates an empty `&[]`.