Skip to content

Commit 27ae2f0

Browse files
committed
Shrink LocalDecl by 56 bytes.
By boxing `local_info`.
1 parent cda1627 commit 27ae2f0

File tree

10 files changed

+46
-46
lines changed

10 files changed

+46
-46
lines changed

src/librustc_middle/mir/mod.rs

+17-17
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ pub struct LocalDecl<'tcx> {
696696
pub mutability: Mutability,
697697

698698
// FIXME(matthewjasper) Don't store in this in `Body`
699-
pub local_info: LocalInfo<'tcx>,
699+
pub local_info: Option<Box<LocalInfo<'tcx>>>,
700700

701701
/// `true` if this is an internal local.
702702
///
@@ -818,9 +818,11 @@ pub struct LocalDecl<'tcx> {
818818

819819
// `LocalDecl` is used a lot. Make sure it doesn't unintentionally get bigger.
820820
#[cfg(target_arch = "x86_64")]
821-
static_assert_size!(LocalDecl<'_>, 128);
821+
static_assert_size!(LocalDecl<'_>, 72);
822822

823-
/// Extra information about a local that's used for diagnostics.
823+
/// Extra information about a some locals that's used for diagnostics. (Not
824+
/// used for non-StaticRef temporaries, the return place, or anonymous function
825+
/// parameters.)
824826
#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)]
825827
pub enum LocalInfo<'tcx> {
826828
/// A user-defined local variable or function parameter
@@ -831,8 +833,6 @@ pub enum LocalInfo<'tcx> {
831833
User(ClearCrossCrate<BindingForm<'tcx>>),
832834
/// A temporary created that references the static with the given `DefId`.
833835
StaticRef { def_id: DefId, is_thread_local: bool },
834-
/// Any other temporary, the return place, or an anonymous function parameter.
835-
Other,
836836
}
837837

838838
impl<'tcx> LocalDecl<'tcx> {
@@ -844,16 +844,16 @@ impl<'tcx> LocalDecl<'tcx> {
844844
/// - or `match ... { C(x) => ... }`
845845
pub fn can_be_made_mutable(&self) -> bool {
846846
match self.local_info {
847-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
847+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
848848
binding_mode: ty::BindingMode::BindByValue(_),
849849
opt_ty_info: _,
850850
opt_match_place: _,
851851
pat_span: _,
852-
}))) => true,
852+
})))) => true,
853853

854-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(
854+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(
855855
ImplicitSelfKind::Imm,
856-
))) => true,
856+
)))) => true,
857857

858858
_ => false,
859859
}
@@ -864,14 +864,14 @@ impl<'tcx> LocalDecl<'tcx> {
864864
/// mutable bindings, but the inverse does not necessarily hold).
865865
pub fn is_nonref_binding(&self) -> bool {
866866
match self.local_info {
867-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
867+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
868868
binding_mode: ty::BindingMode::BindByValue(_),
869869
opt_ty_info: _,
870870
opt_match_place: _,
871871
pat_span: _,
872-
}))) => true,
872+
})))) => true,
873873

874-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(_))) => true,
874+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(_)))) => true,
875875

876876
_ => false,
877877
}
@@ -882,7 +882,7 @@ impl<'tcx> LocalDecl<'tcx> {
882882
#[inline]
883883
pub fn is_user_variable(&self) -> bool {
884884
match self.local_info {
885-
LocalInfo::User(_) => true,
885+
Some(box LocalInfo::User(_)) => true,
886886
_ => false,
887887
}
888888
}
@@ -892,7 +892,7 @@ impl<'tcx> LocalDecl<'tcx> {
892892
/// match arm.
893893
pub fn is_ref_for_guard(&self) -> bool {
894894
match self.local_info {
895-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::RefForGuard)) => true,
895+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::RefForGuard))) => true,
896896
_ => false,
897897
}
898898
}
@@ -901,7 +901,7 @@ impl<'tcx> LocalDecl<'tcx> {
901901
/// access that static
902902
pub fn is_ref_to_static(&self) -> bool {
903903
match self.local_info {
904-
LocalInfo::StaticRef { .. } => true,
904+
Some(box LocalInfo::StaticRef { .. }) => true,
905905
_ => false,
906906
}
907907
}
@@ -910,7 +910,7 @@ impl<'tcx> LocalDecl<'tcx> {
910910
/// access that static
911911
pub fn is_ref_to_thread_local(&self) -> bool {
912912
match self.local_info {
913-
LocalInfo::StaticRef { is_thread_local, .. } => is_thread_local,
913+
Some(box LocalInfo::StaticRef { is_thread_local, .. }) => is_thread_local,
914914
_ => false,
915915
}
916916
}
@@ -933,7 +933,7 @@ impl<'tcx> LocalDecl<'tcx> {
933933
pub fn with_source_info(ty: Ty<'tcx>, source_info: SourceInfo) -> Self {
934934
LocalDecl {
935935
mutability: Mutability::Mut,
936-
local_info: LocalInfo::Other,
936+
local_info: None,
937937
internal: false,
938938
is_block_tail: None,
939939
ty,

src/librustc_mir/borrow_check/diagnostics/conflict_errors.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1448,15 +1448,15 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
14481448
let (place_description, assigned_span) = match local_decl {
14491449
Some(LocalDecl {
14501450
local_info:
1451-
LocalInfo::User(
1451+
Some(box LocalInfo::User(
14521452
ClearCrossCrate::Clear
14531453
| ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
14541454
opt_match_place: None,
14551455
..
14561456
})),
1457-
)
1458-
| LocalInfo::StaticRef { .. }
1459-
| LocalInfo::Other,
1457+
))
1458+
| Some(box LocalInfo::StaticRef { .. })
1459+
| None,
14601460
..
14611461
})
14621462
| None => (self.describe_any_place(place.as_ref()), assigned_span),

src/librustc_mir/borrow_check/diagnostics/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
202202
if self.body.local_decls[local].is_ref_to_static() =>
203203
{
204204
let local_info = &self.body.local_decls[local].local_info;
205-
if let LocalInfo::StaticRef { def_id, .. } = *local_info {
205+
if let Some(box LocalInfo::StaticRef { def_id, .. }) = *local_info {
206206
buf.push_str(&self.infcx.tcx.item_name(def_id).as_str());
207207
} else {
208208
unreachable!();

src/librustc_mir/borrow_check/diagnostics/move_errors.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
103103
//
104104
// opt_match_place is None for let [mut] x = ... statements,
105105
// whether or not the right-hand side is a place expression
106-
if let LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
106+
if let Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
107107
VarBindingForm {
108108
opt_match_place: Some((opt_match_place, match_span)),
109109
binding_mode: _,
110110
opt_ty_info: _,
111111
pat_span: _,
112112
},
113-
))) = local_decl.local_info
113+
)))) = local_decl.local_info
114114
{
115115
let stmt_source_info = self.body.source_info(location);
116116
self.append_binding_error(
@@ -482,10 +482,10 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
482482
let mut suggestions: Vec<(Span, &str, String)> = Vec::new();
483483
for local in binds_to {
484484
let bind_to = &self.body.local_decls[*local];
485-
if let LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
485+
if let Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
486486
pat_span,
487487
..
488-
}))) = bind_to.local_info
488+
})))) = bind_to.local_info
489489
{
490490
if let Ok(pat_snippet) = self.infcx.tcx.sess.source_map().span_to_snippet(pat_span)
491491
{

src/librustc_mir/borrow_check/diagnostics/mutability_errors.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
8585
} else {
8686
item_msg = format!("`{}`", access_place_desc.unwrap());
8787
let local_info = &self.body.local_decls[local].local_info;
88-
if let LocalInfo::StaticRef { def_id, .. } = *local_info {
88+
if let Some(box LocalInfo::StaticRef { def_id, .. }) = *local_info {
8989
let static_name = &self.infcx.tcx.item_name(def_id);
9090
reason = format!(", as `{}` is an immutable static item", static_name);
9191
} else {
@@ -216,9 +216,9 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
216216
.local_decls
217217
.get(local)
218218
.map(|local_decl| {
219-
if let LocalInfo::User(ClearCrossCrate::Set(
219+
if let Some(box LocalInfo::User(ClearCrossCrate::Set(
220220
mir::BindingForm::ImplicitSelf(kind),
221-
)) = local_decl.local_info
221+
))) = local_decl.local_info
222222
{
223223
// Check if the user variable is a `&mut self` and we can therefore
224224
// suggest removing the `&mut`.
@@ -340,16 +340,16 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
340340

341341
match self.local_names[local] {
342342
Some(name) if !local_decl.from_compiler_desugaring() => {
343-
let label = match local_decl.local_info {
344-
LocalInfo::User(ClearCrossCrate::Set(
343+
let label = match local_decl.local_info.as_ref().unwrap() {
344+
box LocalInfo::User(ClearCrossCrate::Set(
345345
mir::BindingForm::ImplicitSelf(_),
346346
)) => {
347347
let (span, suggestion) =
348348
suggest_ampmut_self(self.infcx.tcx, local_decl);
349349
Some((true, span, suggestion))
350350
}
351351

352-
LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var(
352+
box LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var(
353353
mir::VarBindingForm {
354354
binding_mode: ty::BindingMode::BindByValue(_),
355355
opt_ty_info,
@@ -381,14 +381,14 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
381381
self.infcx.tcx,
382382
local_decl,
383383
opt_assignment_rhs_span,
384-
opt_ty_info,
384+
*opt_ty_info,
385385
);
386386
Some((true, span, suggestion))
387387
}
388388
}
389389
}
390390

391-
LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var(
391+
box LocalInfo::User(ClearCrossCrate::Set(mir::BindingForm::Var(
392392
mir::VarBindingForm {
393393
binding_mode: ty::BindingMode::BindByReference(_),
394394
..
@@ -399,7 +399,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
399399
.map(|replacement| (true, pattern_span, replacement))
400400
}
401401

402-
LocalInfo::User(ClearCrossCrate::Clear) => {
402+
box LocalInfo::User(ClearCrossCrate::Clear) => {
403403
bug!("saw cleared local state")
404404
}
405405

src/librustc_mir/transform/check_consts/validation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> {
456456
if proj_base.is_empty() {
457457
if let (local, []) = (place_local, proj_base) {
458458
let decl = &self.body.local_decls[local];
459-
if let LocalInfo::StaticRef { def_id, .. } = decl.local_info {
459+
if let Some(box LocalInfo::StaticRef { def_id, .. }) = decl.local_info {
460460
let span = decl.source_info.span;
461461
self.check_static(def_id, span);
462462
return;

src/librustc_mir/transform/check_unsafety.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
218218
if let [] = proj_base {
219219
let decl = &self.body.local_decls[place.local];
220220
if decl.internal {
221-
if let LocalInfo::StaticRef { def_id, .. } = decl.local_info {
221+
if let Some(box LocalInfo::StaticRef { def_id, .. }) = decl.local_info {
222222
if self.tcx.is_mutable_static(def_id) {
223223
self.require_unsafe(
224224
"use of mutable static",

src/librustc_mir_build/build/expr/as_temp.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
6161
if let ExprKind::StaticRef { def_id, .. } = expr.kind {
6262
let is_thread_local = this.hir.tcx().is_thread_local_static(def_id);
6363
local_decl.internal = true;
64-
local_decl.local_info = LocalInfo::StaticRef { def_id, is_thread_local };
64+
local_decl.local_info = Some(box LocalInfo::StaticRef { def_id, is_thread_local });
6565
}
6666
this.local_decls.push(local_decl)
6767
};

src/librustc_mir_build/build/matches/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
470470
for binding in &candidate_ref.bindings {
471471
let local = self.var_local_id(binding.var_id, OutsideGuard);
472472

473-
if let LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
473+
if let Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
474474
VarBindingForm { opt_match_place: Some((ref mut match_place, _)), .. },
475-
))) = self.local_decls[local].local_info
475+
)))) = self.local_decls[local].local_info
476476
{
477477
*match_place = Some(initializer);
478478
} else {
@@ -1953,7 +1953,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
19531953
source_info,
19541954
internal: false,
19551955
is_block_tail: None,
1956-
local_info: LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
1956+
local_info: Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(VarBindingForm {
19571957
binding_mode,
19581958
// hypothetically, `visit_bindings` could try to unzip
19591959
// an outermost hir::Ty as we descend, matching up
@@ -1962,7 +1962,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
19621962
opt_ty_info: None,
19631963
opt_match_place,
19641964
pat_span,
1965-
}))),
1965+
})))),
19661966
};
19671967
let for_arm_body = self.local_decls.push(local);
19681968
self.var_debug_info.push(VarDebugInfo {
@@ -1980,7 +1980,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
19801980
source_info,
19811981
internal: false,
19821982
is_block_tail: None,
1983-
local_info: LocalInfo::User(ClearCrossCrate::Set(BindingForm::RefForGuard)),
1983+
local_info: Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::RefForGuard))),
19841984
});
19851985
self.var_debug_info.push(VarDebugInfo {
19861986
name,

src/librustc_mir_build/build/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -909,17 +909,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
909909
self.local_decls[local].mutability = mutability;
910910
self.local_decls[local].source_info.scope = self.source_scope;
911911
self.local_decls[local].local_info = if let Some(kind) = self_binding {
912-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(*kind)))
912+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::ImplicitSelf(*kind))))
913913
} else {
914914
let binding_mode = ty::BindingMode::BindByValue(mutability);
915-
LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
915+
Some(box LocalInfo::User(ClearCrossCrate::Set(BindingForm::Var(
916916
VarBindingForm {
917917
binding_mode,
918918
opt_ty_info,
919919
opt_match_place: Some((Some(place), span)),
920920
pat_span: span,
921921
},
922-
)))
922+
))))
923923
};
924924
self.var_indices.insert(var, LocalsForNode::One(local));
925925
}

0 commit comments

Comments
 (0)