// MIR for `slice_iter_next` after runtime-optimized

fn slice_iter_next(_1: &mut std::slice::Iter<'_, T>) -> Option<&T> {
    debug it => _1;
    let mut _0: std::option::Option<&T>;
    scope 1 (inlined <std::slice::Iter<'_, T> as Iterator>::next) {
        let _2: std::ptr::NonNull<T>;
        let _4: std::ptr::NonNull<T>;
        let mut _7: bool;
        let mut _9: std::ptr::NonNull<T>;
        let mut _11: usize;
        let _13: &T;
        scope 2 {
            let _3: *const T;
            scope 3 {
                let _10: usize;
                scope 4 {
                    scope 7 (inlined #[track_caller] core::num::<impl usize>::unchecked_sub) {
                        scope 8 (inlined core::ub_checks::check_language_ub) {
                            scope 9 (inlined core::ub_checks::check_language_ub::runtime) {
                            }
                        }
                    }
                    scope 10 (inlined without_provenance_mut::<T>) {
                    }
                }
                scope 5 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
                    scope 6 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
                    }
                }
                scope 11 (inlined <NonNull<T> as PartialEq>::eq) {
                    let mut _5: *mut T;
                    let mut _6: *mut T;
                    scope 12 (inlined NonNull::<T>::as_ptr) {
                    }
                    scope 13 (inlined NonNull::<T>::as_ptr) {
                    }
                }
                scope 14 (inlined NonNull::<T>::add) {
                    let mut _8: *mut T;
                    scope 15 (inlined NonNull::<T>::as_ptr) {
                    }
                }
                scope 16 (inlined NonNull::<T>::as_ref::<'_>) {
                    let _12: *const T;
                    scope 17 (inlined NonNull::<T>::as_ptr) {
                    }
                    scope 18 (inlined std::ptr::mut_ptr::<impl *mut T>::cast_const) {
                    }
                }
            }
        }
    }

    bb0: {
        StorageLive(_11);
        StorageLive(_5);
        StorageLive(_2);
        _2 = copy ((*_1).0: std::ptr::NonNull<T>);
        StorageLive(_3);
        _3 = copy ((*_1).1: *const T);
        switchInt(const <T as std::mem::SizedTypeProperties>::IS_ZST) -> [0: bb1, otherwise: bb4];
    }

    bb1: {
        StorageLive(_7);
        StorageLive(_4);
        _4 = copy _3 as std::ptr::NonNull<T> (Transmute);
        _5 = copy _2 as *mut T (Transmute);
        StorageLive(_6);
        _6 = copy _4 as *mut T (Transmute);
        _7 = Eq(copy _5, copy _6);
        StorageDead(_6);
        switchInt(move _7) -> [0: bb2, otherwise: bb3];
    }

    bb2: {
        StorageDead(_4);
        StorageDead(_7);
        StorageLive(_9);
        StorageLive(_8);
        _8 = Offset(copy _5, const 1_usize);
        _9 = copy _8 as std::ptr::NonNull<T> (Transmute);
        StorageDead(_8);
        ((*_1).0: std::ptr::NonNull<T>) = move _9;
        StorageDead(_9);
        goto -> bb8;
    }

    bb3: {
        StorageDead(_4);
        _0 = const {transmute(0x0000000000000000): Option<&T>};
        StorageDead(_7);
        goto -> bb6;
    }

    bb4: {
        StorageLive(_10);
        _10 = copy _3 as usize (Transmute);
        switchInt(copy _10) -> [0: bb5, otherwise: bb7];
    }

    bb5: {
        _0 = const {transmute(0x0000000000000000): Option<&T>};
        StorageDead(_10);
        goto -> bb6;
    }

    bb6: {
        StorageDead(_3);
        StorageDead(_2);
        goto -> bb9;
    }

    bb7: {
        _11 = SubUnchecked(copy _10, const 1_usize);
        ((*_1).1: *const T) = copy _11 as *const T (Transmute);
        StorageDead(_10);
        goto -> bb8;
    }

    bb8: {
        StorageLive(_13);
        StorageLive(_12);
        _12 = copy _2 as *const T (Transmute);
        _13 = &(*_12);
        StorageDead(_12);
        _0 = Option::<&T>::Some(copy _13);
        StorageDead(_13);
        StorageDead(_3);
        StorageDead(_2);
        goto -> bb9;
    }

    bb9: {
        StorageDead(_5);
        StorageDead(_11);
        return;
    }
}
