Auto merge of #77466 - Aaron1011:reland-drop-tree, r=matthewjasper
Re-land PR #71840 (Rework MIR drop tree lowering) PR https://github.com/rust-lang/rust/pull/71840 was reverted in https://github.com/rust-lang/rust/pull/72989 to fix an LLVM error (https://github.com/rust-lang/rust/issues/72470). That LLVM error no longer occurs with the recent upgrade to LLVM 11 (https://github.com/rust-lang/rust/pull/73526), so let's try re-landing this PR. I've cherry-picked the commits from the original PR (with the exception of the commit blessing test output), making as few modifications as possible. I addressed the rebase fallout in separate commits on top of those. r? `@matthewjasper`
This commit is contained in:
commit
ced813fec0
81 changed files with 2584 additions and 2828 deletions
|
@ -362,17 +362,18 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> {
|
|||
fn gather_terminator(&mut self, term: &Terminator<'tcx>) {
|
||||
match term.kind {
|
||||
TerminatorKind::Goto { target: _ }
|
||||
| TerminatorKind::FalseEdge { .. }
|
||||
| TerminatorKind::FalseUnwind { .. }
|
||||
// In some sense returning moves the return place into the current
|
||||
// call's destination, however, since there are no statements after
|
||||
// this that could possibly access the return place, this doesn't
|
||||
// need recording.
|
||||
| TerminatorKind::Return
|
||||
| TerminatorKind::Resume
|
||||
| TerminatorKind::Abort
|
||||
| TerminatorKind::GeneratorDrop
|
||||
| TerminatorKind::FalseEdge { .. }
|
||||
| TerminatorKind::FalseUnwind { .. }
|
||||
| TerminatorKind::Unreachable => {}
|
||||
|
||||
TerminatorKind::Return => {
|
||||
self.gather_move(Place::return_place());
|
||||
}
|
||||
|
||||
TerminatorKind::Assert { ref cond, .. } => {
|
||||
self.gather_operand(cond);
|
||||
}
|
||||
|
|
|
@ -231,8 +231,6 @@ where
|
|||
.patch_terminator(bb, TerminatorKind::Goto { target: self.succ });
|
||||
}
|
||||
DropStyle::Static => {
|
||||
let loc = self.terminator_loc(bb);
|
||||
self.elaborator.clear_drop_flag(loc, self.path, DropFlagMode::Deep);
|
||||
self.elaborator.patch().patch_terminator(
|
||||
bb,
|
||||
TerminatorKind::Drop {
|
||||
|
@ -243,9 +241,7 @@ where
|
|||
);
|
||||
}
|
||||
DropStyle::Conditional => {
|
||||
let unwind = self.unwind; // FIXME(#43234)
|
||||
let succ = self.succ;
|
||||
let drop_bb = self.complete_drop(Some(DropFlagMode::Deep), succ, unwind);
|
||||
let drop_bb = self.complete_drop(self.succ, self.unwind);
|
||||
self.elaborator
|
||||
.patch()
|
||||
.patch_terminator(bb, TerminatorKind::Goto { target: drop_bb });
|
||||
|
@ -317,7 +313,7 @@ where
|
|||
// our own drop flag.
|
||||
path: self.path,
|
||||
}
|
||||
.complete_drop(None, succ, unwind)
|
||||
.complete_drop(succ, unwind)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -346,13 +342,7 @@ where
|
|||
// Clear the "master" drop flag at the end. This is needed
|
||||
// because the "master" drop protects the ADT's discriminant,
|
||||
// which is invalidated after the ADT is dropped.
|
||||
let (succ, unwind) = (self.succ, self.unwind); // FIXME(#43234)
|
||||
(
|
||||
self.drop_flag_reset_block(DropFlagMode::Shallow, succ, unwind),
|
||||
unwind.map(|unwind| {
|
||||
self.drop_flag_reset_block(DropFlagMode::Shallow, unwind, Unwind::InCleanup)
|
||||
}),
|
||||
)
|
||||
(self.drop_flag_reset_block(DropFlagMode::Shallow, self.succ, self.unwind), self.unwind)
|
||||
}
|
||||
|
||||
/// Creates a full drop ladder, consisting of 2 connected half-drop-ladders
|
||||
|
@ -884,11 +874,7 @@ where
|
|||
self.open_drop_for_adt(def, substs)
|
||||
}
|
||||
}
|
||||
ty::Dynamic(..) => {
|
||||
let unwind = self.unwind; // FIXME(#43234)
|
||||
let succ = self.succ;
|
||||
self.complete_drop(Some(DropFlagMode::Deep), succ, unwind)
|
||||
}
|
||||
ty::Dynamic(..) => self.complete_drop(self.succ, self.unwind),
|
||||
ty::Array(ety, size) => {
|
||||
let size = size.try_eval_usize(self.tcx(), self.elaborator.param_env());
|
||||
self.open_drop_for_array(ety, size)
|
||||
|
@ -899,20 +885,10 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
fn complete_drop(
|
||||
&mut self,
|
||||
drop_mode: Option<DropFlagMode>,
|
||||
succ: BasicBlock,
|
||||
unwind: Unwind,
|
||||
) -> BasicBlock {
|
||||
debug!("complete_drop({:?},{:?})", self, drop_mode);
|
||||
fn complete_drop(&mut self, succ: BasicBlock, unwind: Unwind) -> BasicBlock {
|
||||
debug!("complete_drop(succ={:?}, unwind={:?})", succ, unwind);
|
||||
|
||||
let drop_block = self.drop_block(succ, unwind);
|
||||
let drop_block = if let Some(mode) = drop_mode {
|
||||
self.drop_flag_reset_block(mode, drop_block, unwind)
|
||||
} else {
|
||||
drop_block
|
||||
};
|
||||
|
||||
self.drop_flag_test_block(drop_block, succ, unwind)
|
||||
}
|
||||
|
@ -927,6 +903,11 @@ where
|
|||
) -> BasicBlock {
|
||||
debug!("drop_flag_reset_block({:?},{:?})", self, mode);
|
||||
|
||||
if unwind.is_cleanup() {
|
||||
// The drop flag isn't read again on the unwind path, so don't
|
||||
// bother setting it.
|
||||
return succ;
|
||||
}
|
||||
let block = self.new_block(unwind, TerminatorKind::Goto { target: succ });
|
||||
let block_start = Location { block, statement_index: 0 };
|
||||
self.elaborator.clear_drop_flag(block_start, self.path, mode);
|
||||
|
@ -1044,11 +1025,6 @@ where
|
|||
self.elaborator.patch().new_temp(ty, self.source_info.span)
|
||||
}
|
||||
|
||||
fn terminator_loc(&mut self, bb: BasicBlock) -> Location {
|
||||
let body = self.elaborator.body();
|
||||
self.elaborator.patch().terminator_loc(body, bb)
|
||||
}
|
||||
|
||||
fn constant_usize(&self, val: u16) -> Operand<'tcx> {
|
||||
Operand::Constant(box Constant {
|
||||
span: self.source_info.span,
|
||||
|
|
|
@ -111,13 +111,19 @@ where
|
|||
write!(w, r#"<table border="0" cellborder="1" cellspacing="0">"#)?;
|
||||
|
||||
// Basic block number at the top.
|
||||
let (blk, bgcolor) = if data.is_cleanup {
|
||||
(format!("{} (cleanup)", block.index()), "lightblue")
|
||||
} else {
|
||||
let color = if dark_mode { "dimgray" } else { "gray" };
|
||||
(format!("{}", block.index()), color)
|
||||
};
|
||||
write!(
|
||||
w,
|
||||
r#"<tr><td bgcolor="{bgcolor}" {attrs} colspan="{colspan}">{blk}</td></tr>"#,
|
||||
bgcolor = if dark_mode { "dimgray" } else { "gray" },
|
||||
attrs = r#"align="center""#,
|
||||
colspan = num_cols,
|
||||
blk = block.index()
|
||||
blk = blk,
|
||||
bgcolor = bgcolor
|
||||
)?;
|
||||
|
||||
init(w)?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue