44//! useful because (unlike MIR building) it runs after type checking, so it can make use of
55//! `TypingMode::PostAnalysis` to provide more precise type information, especially about opaque
66//! types.
7- //!
8- //! When we're optimizing, we also remove calls to `drop_in_place<T>` when `T` isn't `needs_drop`,
9- //! as those are essentially equivalent to `Drop` terminators. While the compiler doesn't insert
10- //! them automatically, preferring the built-in instead, they're common in generic code (such as
11- //! `Vec::truncate`) so removing them from things like inlined `Vec<u8>` is helpful.
127
13- use rustc_hir:: LangItem ;
148use rustc_middle:: mir:: * ;
159use rustc_middle:: ty:: TyCtxt ;
1610use tracing:: { debug, trace} ;
@@ -27,19 +21,8 @@ impl<'tcx> crate::MirPass<'tcx> for RemoveUnneededDrops {
2721 let mut should_simplify = false ;
2822 for block in body. basic_blocks . as_mut ( ) {
2923 let terminator = block. terminator_mut ( ) ;
30- let ( ty, target) = match terminator. kind {
31- TerminatorKind :: Drop { place, target, .. } => {
32- ( place. ty ( & body. local_decls , tcx) . ty , target)
33- }
34- TerminatorKind :: Call { ref func, target : Some ( target) , .. }
35- if tcx. sess . mir_opt_level ( ) > 0
36- && let Some ( ( def_id, generics) ) = func. const_fn_def ( )
37- && tcx. is_lang_item ( def_id, LangItem :: DropInPlace ) =>
38- {
39- ( generics. type_at ( 0 ) , target)
40- }
41- _ => continue ,
42- } ;
24+ let TerminatorKind :: Drop { place, target, .. } = terminator. kind else { continue } ;
25+ let ty = place. ty ( & body. local_decls , tcx) . ty ;
4326
4427 if ty. needs_drop ( tcx, typing_env) {
4528 continue ;
0 commit comments