rustc_mir_transform/
remove_unneeded_drops.rs1use rustc_middle::mir::*;
9use rustc_middle::ty::TyCtxt;
10use tracing::{debug, trace};
11
12use super::simplify::simplify_cfg;
13
14pub(super) struct RemoveUnneededDrops;
15
16impl<'tcx> crate::MirPass<'tcx> for RemoveUnneededDrops {
17 fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
18 trace!("Running RemoveUnneededDrops on {:?}", body.source);
19
20 let typing_env = body.typing_env(tcx);
21 let mut should_simplify = false;
22 for block in body.basic_blocks.as_mut() {
23 let terminator = block.terminator_mut();
24 if let TerminatorKind::Drop { place, target, .. } = terminator.kind {
25 let ty = place.ty(&body.local_decls, tcx);
26 if ty.ty.needs_drop(tcx, typing_env) {
27 continue;
28 }
29 debug!("SUCCESS: replacing `drop` with goto({:?})", target);
30 terminator.kind = TerminatorKind::Goto { target };
31 should_simplify = true;
32 }
33 }
34
35 if should_simplify {
38 simplify_cfg(tcx, body);
39 }
40 }
41
42 fn is_required(&self) -> bool {
43 true
44 }
45}