about summary refs log tree commit diff
diff options
context:
space:
mode:
authorScott McMurray <scottmcm@users.noreply.github.com>2024-06-16 01:22:58 -0700
committerScott McMurray <scottmcm@users.noreply.github.com>2024-06-20 22:16:59 -0700
commitb611b6bbb81c67579429c41dc99f112a807b0a38 (patch)
treec56ff1ac68b816d64ffae87b7f6a63e0865b345b
parent4a7b6c0e6ce760964284d50705eefdc8dea7d0c3 (diff)
downloadrust-b611b6bbb81c67579429c41dc99f112a807b0a38.tar.gz
rust-b611b6bbb81c67579429c41dc99f112a807b0a38.zip
Replace `NormalizeArrayLen` with `GVN`
GVN is actually on in release, and covers all the same things (or more), with `LowerSliceLen` changed to produce `PtrMetadata`.
-rw-r--r--compiler/rustc_mir_transform/src/lib.rs4
-rw-r--r--compiler/rustc_mir_transform/src/lower_slice_len.rs24
-rw-r--r--compiler/rustc_mir_transform/src/normalize_array_len.rs103
-rw-r--r--tests/mir-opt/issue_76432.rs1
-rw-r--r--tests/mir-opt/lower_array_len.array_bound.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-abort.diff)21
-rw-r--r--tests/mir-opt/lower_array_len.array_bound.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-unwind.diff)21
-rw-r--r--tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-abort.diff)33
-rw-r--r--tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-unwind.diff)33
-rw-r--r--tests/mir-opt/lower_array_len.array_len.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-abort.diff)6
-rw-r--r--tests/mir-opt/lower_array_len.array_len.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-unwind.diff)6
-rw-r--r--tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-abort.diff)6
-rw-r--r--tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-unwind.diff)6
-rw-r--r--tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-abort.diff)12
-rw-r--r--tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-unwind.diff)12
-rw-r--r--tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-abort.diff (renamed from tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-abort.diff)12
-rw-r--r--tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-unwind.diff (renamed from tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-unwind.diff)12
-rw-r--r--tests/mir-opt/lower_array_len.rs18
-rw-r--r--tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff2
-rw-r--r--tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff2
-rw-r--r--tests/mir-opt/pre-codegen/slice_index.rs2
-rw-r--r--tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir2
-rw-r--r--tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir2
30 files changed, 138 insertions, 218 deletions
diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs
index 87dd9cc11eb..fe195f0112f 100644
--- a/compiler/rustc_mir_transform/src/lib.rs
+++ b/compiler/rustc_mir_transform/src/lib.rs
@@ -88,7 +88,6 @@ mod lower_slice_len;
 mod match_branches;
 mod mentioned_items;
 mod multiple_return_terminators;
-mod normalize_array_len;
 mod nrvo;
 mod prettify;
 mod promote_consts;
@@ -581,9 +580,6 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
             &o1(simplify::SimplifyCfg::AfterUnreachableEnumBranching),
             // Inlining may have introduced a lot of redundant code and a large move pattern.
             // Now, we need to shrink the generated MIR.
-
-            // Has to run after `slice::len` lowering
-            &normalize_array_len::NormalizeArrayLen,
             &ref_prop::ReferencePropagation,
             &sroa::ScalarReplacementOfAggregates,
             &match_branches::MatchBranchSimplification,
diff --git a/compiler/rustc_mir_transform/src/lower_slice_len.rs b/compiler/rustc_mir_transform/src/lower_slice_len.rs
index 2267a621a83..77a7f4f47dd 100644
--- a/compiler/rustc_mir_transform/src/lower_slice_len.rs
+++ b/compiler/rustc_mir_transform/src/lower_slice_len.rs
@@ -1,10 +1,9 @@
-//! This pass lowers calls to core::slice::len to just Len op.
+//! This pass lowers calls to core::slice::len to just PtrMetadata op.
 //! It should run before inlining!
 
 use rustc_hir::def_id::DefId;
-use rustc_index::IndexSlice;
 use rustc_middle::mir::*;
-use rustc_middle::ty::{self, TyCtxt};
+use rustc_middle::ty::TyCtxt;
 
 pub struct LowerSliceLenCalls;
 
@@ -29,16 +28,11 @@ pub fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
     let basic_blocks = body.basic_blocks.as_mut_preserves_cfg();
     for block in basic_blocks {
         // lower `<[_]>::len` calls
-        lower_slice_len_call(tcx, block, &body.local_decls, slice_len_fn_item_def_id);
+        lower_slice_len_call(block, slice_len_fn_item_def_id);
     }
 }
 
-fn lower_slice_len_call<'tcx>(
-    tcx: TyCtxt<'tcx>,
-    block: &mut BasicBlockData<'tcx>,
-    local_decls: &IndexSlice<Local, LocalDecl<'tcx>>,
-    slice_len_fn_item_def_id: DefId,
-) {
+fn lower_slice_len_call<'tcx>(block: &mut BasicBlockData<'tcx>, slice_len_fn_item_def_id: DefId) {
     let terminator = block.terminator();
     if let TerminatorKind::Call {
         func,
@@ -50,19 +44,17 @@ fn lower_slice_len_call<'tcx>(
     } = &terminator.kind
         // some heuristics for fast rejection
         && let [arg] = &args[..]
-        && let Some(arg) = arg.node.place()
-        && let ty::FnDef(fn_def_id, _) = func.ty(local_decls, tcx).kind()
-        && *fn_def_id == slice_len_fn_item_def_id
+        && let Some((fn_def_id, _)) = func.const_fn_def()
+        && fn_def_id == slice_len_fn_item_def_id
     {
         // perform modifications from something like:
         //     _5 = core::slice::<impl [u8]>::len(move _6) -> bb1
         // into:
-        //     _5 = Len(*_6)
+        //     _5 = PtrMetadata(move _6)
         //     goto bb1
 
         // make new RValue for Len
-        let deref_arg = tcx.mk_place_deref(arg);
-        let r_value = Rvalue::Len(deref_arg);
+        let r_value = Rvalue::UnaryOp(UnOp::PtrMetadata, arg.node.clone());
         let len_statement_kind = StatementKind::Assign(Box::new((*destination, r_value)));
         let add_statement =
             Statement { kind: len_statement_kind, source_info: terminator.source_info };
diff --git a/compiler/rustc_mir_transform/src/normalize_array_len.rs b/compiler/rustc_mir_transform/src/normalize_array_len.rs
deleted file mode 100644
index d5e72706661..00000000000
--- a/compiler/rustc_mir_transform/src/normalize_array_len.rs
+++ /dev/null
@@ -1,103 +0,0 @@
-//! This pass eliminates casting of arrays into slices when their length
-//! is taken using `.len()` method. Handy to preserve information in MIR for const prop
-
-use crate::ssa::SsaLocals;
-use rustc_index::IndexVec;
-use rustc_middle::mir::visit::*;
-use rustc_middle::mir::*;
-use rustc_middle::ty::{self, TyCtxt};
-
-pub struct NormalizeArrayLen;
-
-impl<'tcx> MirPass<'tcx> for NormalizeArrayLen {
-    fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
-        sess.mir_opt_level() >= 3
-    }
-
-    #[instrument(level = "trace", skip(self, tcx, body))]
-    fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-        debug!(def_id = ?body.source.def_id());
-        normalize_array_len_calls(tcx, body)
-    }
-}
-
-fn normalize_array_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
-    let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id());
-    let ssa = SsaLocals::new(tcx, body, param_env);
-
-    let slice_lengths = compute_slice_length(tcx, &ssa, body);
-    debug!(?slice_lengths);
-
-    Replacer { tcx, slice_lengths }.visit_body_preserves_cfg(body);
-}
-
-fn compute_slice_length<'tcx>(
-    tcx: TyCtxt<'tcx>,
-    ssa: &SsaLocals,
-    body: &Body<'tcx>,
-) -> IndexVec<Local, Option<ty::Const<'tcx>>> {
-    let mut slice_lengths = IndexVec::from_elem(None, &body.local_decls);
-
-    for (local, rvalue, _) in ssa.assignments(body) {
-        match rvalue {
-            Rvalue::Cast(
-                CastKind::PointerCoercion(ty::adjustment::PointerCoercion::Unsize),
-                operand,
-                cast_ty,
-            ) => {
-                let operand_ty = operand.ty(body, tcx);
-                debug!(?operand_ty);
-                if let Some(operand_ty) = operand_ty.builtin_deref(true)
-                    && let ty::Array(_, len) = operand_ty.kind()
-                    && let Some(cast_ty) = cast_ty.builtin_deref(true)
-                    && let ty::Slice(..) = cast_ty.kind()
-                {
-                    slice_lengths[local] = Some(*len);
-                }
-            }
-            // The length information is stored in the fat pointer, so we treat `operand` as a value.
-            Rvalue::Use(operand) => {
-                if let Some(rhs) = operand.place()
-                    && let Some(rhs) = rhs.as_local()
-                {
-                    slice_lengths[local] = slice_lengths[rhs];
-                }
-            }
-            // The length information is stored in the fat pointer.
-            // Reborrowing copies length information from one pointer to the other.
-            Rvalue::Ref(_, _, rhs) | Rvalue::AddressOf(_, rhs) => {
-                if let [PlaceElem::Deref] = rhs.projection[..] {
-                    slice_lengths[local] = slice_lengths[rhs.local];
-                }
-            }
-            _ => {}
-        }
-    }
-
-    slice_lengths
-}
-
-struct Replacer<'tcx> {
-    tcx: TyCtxt<'tcx>,
-    slice_lengths: IndexVec<Local, Option<ty::Const<'tcx>>>,
-}
-
-impl<'tcx> MutVisitor<'tcx> for Replacer<'tcx> {
-    fn tcx(&self) -> TyCtxt<'tcx> {
-        self.tcx
-    }
-
-    fn visit_rvalue(&mut self, rvalue: &mut Rvalue<'tcx>, loc: Location) {
-        if let Rvalue::Len(place) = rvalue
-            && let [PlaceElem::Deref] = &place.projection[..]
-            && let Some(len) = self.slice_lengths[place.local]
-        {
-            *rvalue = Rvalue::Use(Operand::Constant(Box::new(ConstOperand {
-                span: rustc_span::DUMMY_SP,
-                user_ty: None,
-                const_: Const::from_ty_const(len, self.tcx.types.usize, self.tcx),
-            })));
-        }
-        self.super_rvalue(rvalue, loc);
-    }
-}
diff --git a/tests/mir-opt/issue_76432.rs b/tests/mir-opt/issue_76432.rs
index 0daeb85434f..6d884063caa 100644
--- a/tests/mir-opt/issue_76432.rs
+++ b/tests/mir-opt/issue_76432.rs
@@ -1,6 +1,5 @@
 // skip-filecheck
 // EMIT_MIR_FOR_EACH_PANIC_STRATEGY
-//@ compile-flags: -Zmir-enable-passes=-NormalizeArrayLen
 // Check that we do not insert StorageDead at each target if StorageDead was never seen
 
 use std::fmt::Debug;
diff --git a/tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_bound.GVN.panic-abort.diff
index 5242c5f6afd..6c0c7a1d438 100644
--- a/tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_bound.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_bound` before NormalizeArrayLen
-+ // MIR for `array_bound` after NormalizeArrayLen
+- // MIR for `array_bound` before GVN
++ // MIR for `array_bound` after GVN
   
   fn array_bound(_1: usize, _2: &[u8; N]) -> u8 {
       debug index => _1;
@@ -24,14 +24,15 @@
           _7 = &(*_2);
           _6 = move _7 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_7);
--         _5 = Len((*_6));
+-         _5 = PtrMetadata(move _6);
 +         _5 = const N;
           goto -> bb1;
       }
   
       bb1: {
           StorageDead(_6);
-          _3 = Lt(move _4, move _5);
+-         _3 = Lt(move _4, move _5);
++         _3 = Lt(_1, move _5);
           switchInt(move _3) -> [0: bb4, otherwise: bb2];
       }
   
@@ -40,13 +41,17 @@
           StorageDead(_4);
           StorageLive(_8);
           _8 = _1;
-          _9 = Len((*_2));
-          _10 = Lt(_8, _9);
-          assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind unreachable];
+-         _9 = Len((*_2));
+-         _10 = Lt(_8, _9);
+-         assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind unreachable];
++         _9 = const N;
++         _10 = Lt(_1, const N);
++         assert(move _10, "index out of bounds: the length is {} but the index is {}", const N, _1) -> [success: bb3, unwind unreachable];
       }
   
       bb3: {
-          _0 = (*_2)[_8];
+-         _0 = (*_2)[_8];
++         _0 = (*_2)[_1];
           StorageDead(_8);
           goto -> bb5;
       }
diff --git a/tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_bound.GVN.panic-unwind.diff
index a9e99933b12..ed41703c873 100644
--- a/tests/mir-opt/lower_array_len.array_bound.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_bound.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_bound` before NormalizeArrayLen
-+ // MIR for `array_bound` after NormalizeArrayLen
+- // MIR for `array_bound` before GVN
++ // MIR for `array_bound` after GVN
   
   fn array_bound(_1: usize, _2: &[u8; N]) -> u8 {
       debug index => _1;
@@ -24,14 +24,15 @@
           _7 = &(*_2);
           _6 = move _7 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_7);
--         _5 = Len((*_6));
+-         _5 = PtrMetadata(move _6);
 +         _5 = const N;
           goto -> bb1;
       }
   
       bb1: {
           StorageDead(_6);
-          _3 = Lt(move _4, move _5);
+-         _3 = Lt(move _4, move _5);
++         _3 = Lt(_1, move _5);
           switchInt(move _3) -> [0: bb4, otherwise: bb2];
       }
   
@@ -40,13 +41,17 @@
           StorageDead(_4);
           StorageLive(_8);
           _8 = _1;
-          _9 = Len((*_2));
-          _10 = Lt(_8, _9);
-          assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind continue];
+-         _9 = Len((*_2));
+-         _10 = Lt(_8, _9);
+-         assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind continue];
++         _9 = const N;
++         _10 = Lt(_1, const N);
++         assert(move _10, "index out of bounds: the length is {} but the index is {}", const N, _1) -> [success: bb3, unwind continue];
       }
   
       bb3: {
-          _0 = (*_2)[_8];
+-         _0 = (*_2)[_8];
++         _0 = (*_2)[_1];
           StorageDead(_8);
           goto -> bb5;
       }
diff --git a/tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-abort.diff
index 7749ba6beca..80e8ea37f41 100644
--- a/tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_bound_mut` before NormalizeArrayLen
-+ // MIR for `array_bound_mut` after NormalizeArrayLen
+- // MIR for `array_bound_mut` before GVN
++ // MIR for `array_bound_mut` after GVN
   
   fn array_bound_mut(_1: usize, _2: &mut [u8; N]) -> u8 {
       debug index => _1;
@@ -27,14 +27,15 @@
           _7 = &(*_2);
           _6 = move _7 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_7);
--         _5 = Len((*_6));
+-         _5 = PtrMetadata(move _6);
 +         _5 = const N;
           goto -> bb1;
       }
   
       bb1: {
           StorageDead(_6);
-          _3 = Lt(move _4, move _5);
+-         _3 = Lt(move _4, move _5);
++         _3 = Lt(_1, move _5);
           switchInt(move _3) -> [0: bb4, otherwise: bb2];
       }
   
@@ -43,13 +44,17 @@
           StorageDead(_4);
           StorageLive(_8);
           _8 = _1;
-          _9 = Len((*_2));
-          _10 = Lt(_8, _9);
-          assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind unreachable];
+-         _9 = Len((*_2));
+-         _10 = Lt(_8, _9);
+-         assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind unreachable];
++         _9 = const N;
++         _10 = Lt(_1, const N);
++         assert(move _10, "index out of bounds: the length is {} but the index is {}", const N, _1) -> [success: bb3, unwind unreachable];
       }
   
       bb3: {
-          _0 = (*_2)[_8];
+-         _0 = (*_2)[_8];
++         _0 = (*_2)[_1];
           StorageDead(_8);
           goto -> bb6;
       }
@@ -59,13 +64,17 @@
           StorageDead(_4);
           StorageLive(_11);
           _11 = const 0_usize;
-          _12 = Len((*_2));
-          _13 = Lt(_11, _12);
-          assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb5, unwind unreachable];
+-         _12 = Len((*_2));
+-         _13 = Lt(_11, _12);
+-         assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb5, unwind unreachable];
++         _12 = const N;
++         _13 = Lt(const 0_usize, const N);
++         assert(move _13, "index out of bounds: the length is {} but the index is {}", const N, const 0_usize) -> [success: bb5, unwind unreachable];
       }
   
       bb5: {
-          (*_2)[_11] = const 42_u8;
+-         (*_2)[_11] = const 42_u8;
++         (*_2)[0 of 1] = const 42_u8;
           StorageDead(_11);
           _0 = const 42_u8;
           goto -> bb6;
diff --git a/tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-unwind.diff
index fcc2c1653dc..6e67a6c17ef 100644
--- a/tests/mir-opt/lower_array_len.array_bound_mut.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_bound_mut.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_bound_mut` before NormalizeArrayLen
-+ // MIR for `array_bound_mut` after NormalizeArrayLen
+- // MIR for `array_bound_mut` before GVN
++ // MIR for `array_bound_mut` after GVN
   
   fn array_bound_mut(_1: usize, _2: &mut [u8; N]) -> u8 {
       debug index => _1;
@@ -27,14 +27,15 @@
           _7 = &(*_2);
           _6 = move _7 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_7);
--         _5 = Len((*_6));
+-         _5 = PtrMetadata(move _6);
 +         _5 = const N;
           goto -> bb1;
       }
   
       bb1: {
           StorageDead(_6);
-          _3 = Lt(move _4, move _5);
+-         _3 = Lt(move _4, move _5);
++         _3 = Lt(_1, move _5);
           switchInt(move _3) -> [0: bb4, otherwise: bb2];
       }
   
@@ -43,13 +44,17 @@
           StorageDead(_4);
           StorageLive(_8);
           _8 = _1;
-          _9 = Len((*_2));
-          _10 = Lt(_8, _9);
-          assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind continue];
+-         _9 = Len((*_2));
+-         _10 = Lt(_8, _9);
+-         assert(move _10, "index out of bounds: the length is {} but the index is {}", move _9, _8) -> [success: bb3, unwind continue];
++         _9 = const N;
++         _10 = Lt(_1, const N);
++         assert(move _10, "index out of bounds: the length is {} but the index is {}", const N, _1) -> [success: bb3, unwind continue];
       }
   
       bb3: {
-          _0 = (*_2)[_8];
+-         _0 = (*_2)[_8];
++         _0 = (*_2)[_1];
           StorageDead(_8);
           goto -> bb6;
       }
@@ -59,13 +64,17 @@
           StorageDead(_4);
           StorageLive(_11);
           _11 = const 0_usize;
-          _12 = Len((*_2));
-          _13 = Lt(_11, _12);
-          assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb5, unwind continue];
+-         _12 = Len((*_2));
+-         _13 = Lt(_11, _12);
+-         assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb5, unwind continue];
++         _12 = const N;
++         _13 = Lt(const 0_usize, const N);
++         assert(move _13, "index out of bounds: the length is {} but the index is {}", const N, const 0_usize) -> [success: bb5, unwind continue];
       }
   
       bb5: {
-          (*_2)[_11] = const 42_u8;
+-         (*_2)[_11] = const 42_u8;
++         (*_2)[0 of 1] = const 42_u8;
           StorageDead(_11);
           _0 = const 42_u8;
           goto -> bb6;
diff --git a/tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_len.GVN.panic-abort.diff
index 1bdc62183c3..9c1b9a708c5 100644
--- a/tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_len.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len` before NormalizeArrayLen
-+ // MIR for `array_len` after NormalizeArrayLen
+- // MIR for `array_len` before GVN
++ // MIR for `array_len` after GVN
   
   fn array_len(_1: &[u8; N]) -> usize {
       debug arr => _1;
@@ -13,7 +13,7 @@
           _3 = &(*_1);
           _2 = move _3 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_3);
--         _0 = Len((*_2));
+-         _0 = PtrMetadata(move _2);
 +         _0 = const N;
           goto -> bb1;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_len.GVN.panic-unwind.diff
index 1bdc62183c3..9c1b9a708c5 100644
--- a/tests/mir-opt/lower_array_len.array_len.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_len.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len` before NormalizeArrayLen
-+ // MIR for `array_len` after NormalizeArrayLen
+- // MIR for `array_len` before GVN
++ // MIR for `array_len` after GVN
   
   fn array_len(_1: &[u8; N]) -> usize {
       debug arr => _1;
@@ -13,7 +13,7 @@
           _3 = &(*_1);
           _2 = move _3 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_3);
--         _0 = Len((*_2));
+-         _0 = PtrMetadata(move _2);
 +         _0 = const N;
           goto -> bb1;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-abort.diff
index 9862b2fad8e..97fa503ac2e 100644
--- a/tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_by_value` before NormalizeArrayLen
-+ // MIR for `array_len_by_value` after NormalizeArrayLen
+- // MIR for `array_len_by_value` before GVN
++ // MIR for `array_len_by_value` after GVN
   
   fn array_len_by_value(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -13,7 +13,7 @@
           _3 = &_1;
           _2 = move _3 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_3);
--         _0 = Len((*_2));
+-         _0 = PtrMetadata(move _2);
 +         _0 = const N;
           goto -> bb1;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-unwind.diff
index 9862b2fad8e..97fa503ac2e 100644
--- a/tests/mir-opt/lower_array_len.array_len_by_value.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_len_by_value.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_by_value` before NormalizeArrayLen
-+ // MIR for `array_len_by_value` after NormalizeArrayLen
+- // MIR for `array_len_by_value` before GVN
++ // MIR for `array_len_by_value` after GVN
   
   fn array_len_by_value(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -13,7 +13,7 @@
           _3 = &_1;
           _2 = move _3 as &[u8] (PointerCoercion(Unsize));
           StorageDead(_3);
--         _0 = Len((*_2));
+-         _0 = PtrMetadata(move _2);
 +         _0 = const N;
           goto -> bb1;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-abort.diff
index 633a344a2ed..b5e8b66813a 100644
--- a/tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_raw` before NormalizeArrayLen
-+ // MIR for `array_len_raw` after NormalizeArrayLen
+- // MIR for `array_len_raw` before GVN
++ // MIR for `array_len_raw` after GVN
   
   fn array_len_raw(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -18,7 +18,8 @@
       }
   
       bb0: {
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
           StorageLive(_4);
           _4 = &_1;
@@ -32,7 +33,7 @@
           StorageLive(_7);
           _7 = &(*_5);
           _6 = &(*_7);
--         _0 = Len((*_6));
+-         _0 = PtrMetadata(move _6);
 +         _0 = const N;
           goto -> bb1;
       }
@@ -40,7 +41,8 @@
       bb1: {
           StorageDead(_6);
           StorageDead(_5);
-          StorageDead(_2);
+-         StorageDead(_2);
++         nop;
           StorageDead(_7);
           return;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-unwind.diff
index 633a344a2ed..b5e8b66813a 100644
--- a/tests/mir-opt/lower_array_len.array_len_raw.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_len_raw.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_raw` before NormalizeArrayLen
-+ // MIR for `array_len_raw` after NormalizeArrayLen
+- // MIR for `array_len_raw` before GVN
++ // MIR for `array_len_raw` after GVN
   
   fn array_len_raw(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -18,7 +18,8 @@
       }
   
       bb0: {
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
           StorageLive(_4);
           _4 = &_1;
@@ -32,7 +33,7 @@
           StorageLive(_7);
           _7 = &(*_5);
           _6 = &(*_7);
--         _0 = Len((*_6));
+-         _0 = PtrMetadata(move _6);
 +         _0 = const N;
           goto -> bb1;
       }
@@ -40,7 +41,8 @@
       bb1: {
           StorageDead(_6);
           StorageDead(_5);
-          StorageDead(_2);
+-         StorageDead(_2);
++         nop;
           StorageDead(_7);
           return;
       }
diff --git a/tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-abort.diff b/tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-abort.diff
index ecba06a2e4d..0299c6acd80 100644
--- a/tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-abort.diff
+++ b/tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-abort.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_reborrow` before NormalizeArrayLen
-+ // MIR for `array_len_reborrow` after NormalizeArrayLen
+- // MIR for `array_len_reborrow` before GVN
++ // MIR for `array_len_reborrow` after GVN
   
   fn array_len_reborrow(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -17,7 +17,8 @@
       }
   
       bb0: {
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
           StorageLive(_4);
           _4 = &mut _1;
@@ -29,7 +30,7 @@
           _5 = &(*_2);
           StorageLive(_6);
           _6 = &(*_5);
--         _0 = Len((*_6));
+-         _0 = PtrMetadata(move _6);
 +         _0 = const N;
           goto -> bb1;
       }
@@ -37,7 +38,8 @@
       bb1: {
           StorageDead(_6);
           StorageDead(_5);
-          StorageDead(_2);
+-         StorageDead(_2);
++         nop;
           return;
       }
   }
diff --git a/tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-unwind.diff b/tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-unwind.diff
index ecba06a2e4d..0299c6acd80 100644
--- a/tests/mir-opt/lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-unwind.diff
+++ b/tests/mir-opt/lower_array_len.array_len_reborrow.GVN.panic-unwind.diff
@@ -1,5 +1,5 @@
-- // MIR for `array_len_reborrow` before NormalizeArrayLen
-+ // MIR for `array_len_reborrow` after NormalizeArrayLen
+- // MIR for `array_len_reborrow` before GVN
++ // MIR for `array_len_reborrow` after GVN
   
   fn array_len_reborrow(_1: [u8; N]) -> usize {
       debug arr => _1;
@@ -17,7 +17,8 @@
       }
   
       bb0: {
-          StorageLive(_2);
+-         StorageLive(_2);
++         nop;
           StorageLive(_3);
           StorageLive(_4);
           _4 = &mut _1;
@@ -29,7 +30,7 @@
           _5 = &(*_2);
           StorageLive(_6);
           _6 = &(*_5);
--         _0 = Len((*_6));
+-         _0 = PtrMetadata(move _6);
 +         _0 = const N;
           goto -> bb1;
       }
@@ -37,7 +38,8 @@
       bb1: {
           StorageDead(_6);
           StorageDead(_5);
-          StorageDead(_2);
+-         StorageDead(_2);
++         nop;
           return;
       }
   }
diff --git a/tests/mir-opt/lower_array_len.rs b/tests/mir-opt/lower_array_len.rs
index 62fc9ef67d6..caa598d067a 100644
--- a/tests/mir-opt/lower_array_len.rs
+++ b/tests/mir-opt/lower_array_len.rs
@@ -1,20 +1,20 @@
 // EMIT_MIR_FOR_EACH_PANIC_STRATEGY
-//@ test-mir-pass: NormalizeArrayLen
+//@ test-mir-pass: GVN
 //@ compile-flags: -Zmir-enable-passes=+LowerSliceLenCalls
 
-// EMIT_MIR lower_array_len.array_bound.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_bound.GVN.diff
 pub fn array_bound<const N: usize>(index: usize, slice: &[u8; N]) -> u8 {
     // CHECK-LABEL: fn array_bound(
     // CHECK: [[len:_.*]] = const N;
-    // CHECK: Lt(move {{_.*}}, move [[len]]);
+    // CHECK: Lt(_1, move [[len]]);
     if index < slice.len() { slice[index] } else { 42 }
 }
 
-// EMIT_MIR lower_array_len.array_bound_mut.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_bound_mut.GVN.diff
 pub fn array_bound_mut<const N: usize>(index: usize, slice: &mut [u8; N]) -> u8 {
     // CHECK-LABEL: fn array_bound_mut(
     // CHECK: [[len:_.*]] = const N;
-    // CHECK: Lt(move {{_.*}}, move [[len]]);
+    // CHECK: Lt(_1, move [[len]]);
     if index < slice.len() {
         slice[index]
     } else {
@@ -24,21 +24,21 @@ pub fn array_bound_mut<const N: usize>(index: usize, slice: &mut [u8; N]) -> u8
     }
 }
 
-// EMIT_MIR lower_array_len.array_len.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_len.GVN.diff
 pub fn array_len<const N: usize>(arr: &[u8; N]) -> usize {
     // CHECK-LABEL: fn array_len(
     // CHECK: _0 = const N;
     arr.len()
 }
 
-// EMIT_MIR lower_array_len.array_len_by_value.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_len_by_value.GVN.diff
 pub fn array_len_by_value<const N: usize>(arr: [u8; N]) -> usize {
     // CHECK-LABEL: fn array_len_by_value(
     // CHECK: _0 = const N;
     arr.len()
 }
 
-// EMIT_MIR lower_array_len.array_len_reborrow.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_len_reborrow.GVN.diff
 pub fn array_len_reborrow<const N: usize>(mut arr: [u8; N]) -> usize {
     // CHECK-LABEL: fn array_len_reborrow(
     // CHECK: _0 = const N;
@@ -47,7 +47,7 @@ pub fn array_len_reborrow<const N: usize>(mut arr: [u8; N]) -> usize {
     arr.len()
 }
 
-// EMIT_MIR lower_array_len.array_len_raw.NormalizeArrayLen.diff
+// EMIT_MIR lower_array_len.array_len_raw.GVN.diff
 pub fn array_len_raw<const N: usize>(arr: [u8; N]) -> usize {
     // CHECK-LABEL: fn array_len_raw(
     // CHECK: _0 = const N;
diff --git a/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff b/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff
index 7f752ca0f5a..a212ee67881 100644
--- a/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff
+++ b/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff
@@ -21,7 +21,7 @@
           StorageLive(_6);
           _6 = &(*_2);
 -         _5 = core::slice::<impl [u8]>::len(move _6) -> [return: bb1, unwind unreachable];
-+         _5 = Len((*_6));
++         _5 = PtrMetadata(move _6);
 +         goto -> bb1;
       }
   
diff --git a/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff b/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff
index d73b563a0e5..38ec8a5b0c7 100644
--- a/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff
+++ b/tests/mir-opt/lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff
@@ -21,7 +21,7 @@
           StorageLive(_6);
           _6 = &(*_2);
 -         _5 = core::slice::<impl [u8]>::len(move _6) -> [return: bb1, unwind continue];
-+         _5 = Len((*_6));
++         _5 = PtrMetadata(move _6);
 +         goto -> bb1;
       }
   
diff --git a/tests/mir-opt/pre-codegen/slice_index.rs b/tests/mir-opt/pre-codegen/slice_index.rs
index 886e57a3380..6ddc4ad0220 100644
--- a/tests/mir-opt/pre-codegen/slice_index.rs
+++ b/tests/mir-opt/pre-codegen/slice_index.rs
@@ -19,7 +19,7 @@ pub fn slice_index_usize(slice: &[u32], index: usize) -> u32 {
 // EMIT_MIR slice_index.slice_get_mut_usize.PreCodegen.after.mir
 pub fn slice_get_mut_usize(slice: &mut [u32], index: usize) -> Option<&mut u32> {
     // CHECK-LABEL: slice_get_mut_usize
-    // CHECK: [[LEN:_[0-9]+]] = Len((*_1))
+    // CHECK: [[LEN:_[0-9]+]] = PtrMetadata(_1)
     // CHECK: Lt(_2, move [[LEN]])
     // CHECK-NOT: precondition_check
     slice.get_mut(index)
diff --git a/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir b/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir
index f2ef2b0cc3c..d7f09fafeeb 100644
--- a/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir
+++ b/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir
@@ -23,7 +23,7 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
         StorageLive(_7);
         StorageLive(_4);
         StorageLive(_3);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = Lt(_2, move _3);
         switchInt(move _4) -> [0: bb1, otherwise: bb2];
     }
diff --git a/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir b/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir
index f2ef2b0cc3c..d7f09fafeeb 100644
--- a/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir
+++ b/tests/mir-opt/pre-codegen/slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir
@@ -23,7 +23,7 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
         StorageLive(_7);
         StorageLive(_4);
         StorageLive(_3);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = Lt(_2, move _3);
         switchInt(move _4) -> [0: bb1, otherwise: bb2];
     }
diff --git a/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir b/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir
index 35a1c783bf2..953e7550479 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir
@@ -90,7 +90,7 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };
diff --git a/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir b/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir
index f805967d64f..d5fdb2e08cc 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir
@@ -65,7 +65,7 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };
diff --git a/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir b/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir
index 6ae64200f4e..cc2beac06f2 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-abort.mir
@@ -57,7 +57,7 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };
diff --git a/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir b/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir
index ac72329fcd6..d66edb28570 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir
@@ -57,7 +57,7 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };
diff --git a/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir b/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir
index dbe6f39548c..cea2fcbcdc0 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-abort.mir
@@ -40,7 +40,7 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
     }
 
     bb0: {
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         StorageLive(_4);
         _4 = const 0_usize;
         goto -> bb1;
diff --git a/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir b/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir
index 5b6441cfb3b..bd658a770ea 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.range_loop.PreCodegen.after.panic-unwind.mir
@@ -40,7 +40,7 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
     }
 
     bb0: {
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         StorageLive(_4);
         _4 = const 0_usize;
         goto -> bb1;
diff --git a/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir b/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir
index 8008336e268..fbb887fe76a 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir
@@ -65,7 +65,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };
diff --git a/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir b/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir
index 47253bf7a0d..db9409f72ab 100644
--- a/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir
+++ b/tests/mir-opt/pre-codegen/slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir
@@ -65,7 +65,7 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
         StorageLive(_6);
         StorageLive(_4);
         StorageLive(_5);
-        _3 = Len((*_1));
+        _3 = PtrMetadata(_1);
         _4 = &raw const (*_1);
         _5 = _4 as *const T (PtrToPtr);
         _6 = NonNull::<T> { pointer: _5 };