Skip to content

Commit 07ad998

Browse files
authored
Unrolled build for rust-lang#138410
Rollup merge of rust-lang#138410 - bjorn3:misc_cleanups, r=compiler-errors Couple mir building cleanups
2 parents 0ce1369 + 8dc0c0e commit 07ad998

File tree

2 files changed

+28
-36
lines changed

2 files changed

+28
-36
lines changed

compiler/rustc_mir_build/src/builder/expr/as_constant.rs

+11-16
Original file line numberDiff line numberDiff line change
@@ -105,23 +105,19 @@ fn lit_to_mir_constant<'tcx>(tcx: TyCtxt<'tcx>, lit_input: LitToConstInput<'tcx>
105105
return Const::Ty(Ty::new_error(tcx, guar), ty::Const::new_error(tcx, guar));
106106
}
107107

108-
let trunc = |n, width: ty::UintTy| {
109-
let width = width
110-
.normalize(tcx.data_layout.pointer_size.bits().try_into().unwrap())
111-
.bit_width()
112-
.unwrap();
113-
let width = Size::from_bits(width);
108+
let lit_ty = match *ty.kind() {
109+
ty::Pat(base, _) => base,
110+
_ => ty,
111+
};
112+
113+
let trunc = |n| {
114+
let width = lit_ty.primitive_size(tcx);
114115
trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
115116
let result = width.truncate(n);
116117
trace!("trunc result: {}", result);
117118
ConstValue::Scalar(Scalar::from_uint(result, width))
118119
};
119120

120-
let lit_ty = match *ty.kind() {
121-
ty::Pat(base, _) => base,
122-
_ => ty,
123-
};
124-
125121
let value = match (lit, lit_ty.kind()) {
126122
(ast::LitKind::Str(s, _), ty::Ref(_, inner_ty, _)) if inner_ty.is_str() => {
127123
let s = s.as_str();
@@ -149,11 +145,10 @@ fn lit_to_mir_constant<'tcx>(tcx: TyCtxt<'tcx>, lit_input: LitToConstInput<'tcx>
149145
(ast::LitKind::Byte(n), ty::Uint(ty::UintTy::U8)) => {
150146
ConstValue::Scalar(Scalar::from_uint(*n, Size::from_bytes(1)))
151147
}
152-
(ast::LitKind::Int(n, _), ty::Uint(ui)) if !neg => trunc(n.get(), *ui),
153-
(ast::LitKind::Int(n, _), ty::Int(i)) => trunc(
154-
if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() },
155-
i.to_unsigned(),
156-
),
148+
(ast::LitKind::Int(n, _), ty::Uint(_)) if !neg => trunc(n.get()),
149+
(ast::LitKind::Int(n, _), ty::Int(_)) => {
150+
trunc(if neg { (n.get() as i128).overflowing_neg().0 as u128 } else { n.get() })
151+
}
157152
(ast::LitKind::Float(n, _), ty::Float(fty)) => {
158153
parse_float_into_constval(*n, *fty, neg).unwrap()
159154
}

compiler/rustc_mir_build/src/builder/scope.rs

+17-20
Original file line numberDiff line numberDiff line change
@@ -305,27 +305,25 @@ impl DropTree {
305305
}
306306

307307
/// Builds the MIR for a given drop tree.
308-
///
309-
/// `blocks` should have the same length as `self.drops`, and may have its
310-
/// first value set to some already existing block.
311308
fn build_mir<'tcx, T: DropTreeBuilder<'tcx>>(
312309
&mut self,
313310
cfg: &mut CFG<'tcx>,
314-
blocks: &mut IndexVec<DropIdx, Option<BasicBlock>>,
315-
) {
311+
root_node: Option<BasicBlock>,
312+
) -> IndexVec<DropIdx, Option<BasicBlock>> {
316313
debug!("DropTree::build_mir(drops = {:#?})", self);
317-
assert_eq!(blocks.len(), self.drops.len());
318314

319-
self.assign_blocks::<T>(cfg, blocks);
320-
self.link_blocks(cfg, blocks)
315+
let mut blocks = self.assign_blocks::<T>(cfg, root_node);
316+
self.link_blocks(cfg, &mut blocks);
317+
318+
blocks
321319
}
322320

323321
/// Assign blocks for all of the drops in the drop tree that need them.
324322
fn assign_blocks<'tcx, T: DropTreeBuilder<'tcx>>(
325323
&mut self,
326324
cfg: &mut CFG<'tcx>,
327-
blocks: &mut IndexVec<DropIdx, Option<BasicBlock>>,
328-
) {
325+
root_node: Option<BasicBlock>,
326+
) -> IndexVec<DropIdx, Option<BasicBlock>> {
329327
// StorageDead statements can share blocks with each other and also with
330328
// a Drop terminator. We iterate through the drops to find which drops
331329
// need their own block.
@@ -342,8 +340,11 @@ impl DropTree {
342340
Own,
343341
}
344342

343+
let mut blocks = IndexVec::from_elem(None, &self.drops);
344+
blocks[ROOT_NODE] = root_node;
345+
345346
let mut needs_block = IndexVec::from_elem(Block::None, &self.drops);
346-
if blocks[ROOT_NODE].is_some() {
347+
if root_node.is_some() {
347348
// In some cases (such as drops for `continue`) the root node
348349
// already has a block. In this case, make sure that we don't
349350
// override it.
@@ -385,6 +386,8 @@ impl DropTree {
385386

386387
debug!("assign_blocks: blocks = {:#?}", blocks);
387388
assert!(entry_points.is_empty());
389+
390+
blocks
388391
}
389392

390393
fn link_blocks<'tcx>(
@@ -1574,10 +1577,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> {
15741577
span: Span,
15751578
continue_block: Option<BasicBlock>,
15761579
) -> Option<BlockAnd<()>> {
1577-
let mut blocks = IndexVec::from_elem(None, &drops.drops);
1578-
blocks[ROOT_NODE] = continue_block;
1579-
1580-
drops.build_mir::<ExitScopes>(&mut self.cfg, &mut blocks);
1580+
let blocks = drops.build_mir::<ExitScopes>(&mut self.cfg, continue_block);
15811581
let is_coroutine = self.coroutine.is_some();
15821582

15831583
// Link the exit drop tree to unwind drop tree.
@@ -1633,8 +1633,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> {
16331633
let drops = &mut self.scopes.coroutine_drops;
16341634
let cfg = &mut self.cfg;
16351635
let fn_span = self.fn_span;
1636-
let mut blocks = IndexVec::from_elem(None, &drops.drops);
1637-
drops.build_mir::<CoroutineDrop>(cfg, &mut blocks);
1636+
let blocks = drops.build_mir::<CoroutineDrop>(cfg, None);
16381637
if let Some(root_block) = blocks[ROOT_NODE] {
16391638
cfg.terminate(
16401639
root_block,
@@ -1670,9 +1669,7 @@ impl<'a, 'tcx: 'a> Builder<'a, 'tcx> {
16701669
fn_span: Span,
16711670
resume_block: &mut Option<BasicBlock>,
16721671
) {
1673-
let mut blocks = IndexVec::from_elem(None, &drops.drops);
1674-
blocks[ROOT_NODE] = *resume_block;
1675-
drops.build_mir::<Unwind>(cfg, &mut blocks);
1672+
let blocks = drops.build_mir::<Unwind>(cfg, *resume_block);
16761673
if let (None, Some(resume)) = (*resume_block, blocks[ROOT_NODE]) {
16771674
cfg.terminate(resume, SourceInfo::outermost(fn_span), TerminatorKind::UnwindResume);
16781675

0 commit comments

Comments
 (0)