1
Fork 0

Auto merge of #109025 - cjgillot:refprop-dbg, r=JakobDegen

Enable MIR reference propagation by default
This commit is contained in:
bors 2023-07-14 17:32:59 +00:00
commit 079e544174
43 changed files with 707 additions and 905 deletions

View file

@ -553,6 +553,7 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
&normalize_array_len::NormalizeArrayLen, // has to run after `slice::len` lowering &normalize_array_len::NormalizeArrayLen, // has to run after `slice::len` lowering
&const_goto::ConstGoto, &const_goto::ConstGoto,
&remove_unneeded_drops::RemoveUnneededDrops, &remove_unneeded_drops::RemoveUnneededDrops,
&ref_prop::ReferencePropagation,
&sroa::ScalarReplacementOfAggregates, &sroa::ScalarReplacementOfAggregates,
&match_branches::MatchBranchSimplification, &match_branches::MatchBranchSimplification,
// inst combine is after MatchBranchSimplification to clean up Ne(_1, false) // inst combine is after MatchBranchSimplification to clean up Ne(_1, false)
@ -560,7 +561,6 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
&instsimplify::InstSimplify, &instsimplify::InstSimplify,
&simplify::SimplifyLocals::BeforeConstProp, &simplify::SimplifyLocals::BeforeConstProp,
&copy_prop::CopyProp, &copy_prop::CopyProp,
&ref_prop::ReferencePropagation,
// Perform `SeparateConstSwitch` after SSA-based analyses, as cloning blocks may // Perform `SeparateConstSwitch` after SSA-based analyses, as cloning blocks may
// destroy the SSA property. It should still happen before const-propagation, so the // destroy the SSA property. It should still happen before const-propagation, so the
// latter pass will leverage the created opportunities. // latter pass will leverage the created opportunities.

View file

@ -71,7 +71,7 @@ pub struct ReferencePropagation;
impl<'tcx> MirPass<'tcx> for ReferencePropagation { impl<'tcx> MirPass<'tcx> for ReferencePropagation {
fn is_enabled(&self, sess: &rustc_session::Session) -> bool { fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
sess.mir_opt_level() >= 4 sess.mir_opt_level() >= 2
} }
#[instrument(level = "trace", skip(self, tcx, body))] #[instrument(level = "trace", skip(self, tcx, body))]
@ -355,7 +355,10 @@ impl<'tcx> MutVisitor<'tcx> for Replacer<'tcx> {
} }
fn visit_var_debug_info(&mut self, debuginfo: &mut VarDebugInfo<'tcx>) { fn visit_var_debug_info(&mut self, debuginfo: &mut VarDebugInfo<'tcx>) {
if let VarDebugInfoContents::Place(ref mut place) = debuginfo.value // If the debuginfo is a pointer to another place:
// - if it's a reborrow, see through it;
// - if it's a direct borrow, increase `debuginfo.references`.
while let VarDebugInfoContents::Place(ref mut place) = debuginfo.value
&& place.projection.is_empty() && place.projection.is_empty()
&& let Value::Pointer(target, _) = self.targets[place.local] && let Value::Pointer(target, _) = self.targets[place.local]
&& target.projection.iter().all(|p| p.can_use_in_debuginfo()) && target.projection.iter().all(|p| p.can_use_in_debuginfo())
@ -369,28 +372,37 @@ impl<'tcx> MutVisitor<'tcx> for Replacer<'tcx> {
debuginfo.references = references; debuginfo.references = references;
*place = target; *place = target;
self.any_replacement = true; self.any_replacement = true;
} else {
break
} }
} }
// Simplify eventual projections left inside `debuginfo`.
self.super_var_debug_info(debuginfo);
} }
fn visit_place(&mut self, place: &mut Place<'tcx>, ctxt: PlaceContext, loc: Location) { fn visit_place(&mut self, place: &mut Place<'tcx>, ctxt: PlaceContext, loc: Location) {
if place.projection.first() != Some(&PlaceElem::Deref) {
return;
}
loop { loop {
if let Value::Pointer(target, _) = self.targets[place.local] { if place.projection.first() != Some(&PlaceElem::Deref) {
let perform_opt = matches!(ctxt, PlaceContext::NonUse(_)) return;
|| self.allowed_replacements.contains(&(target.local, loc));
if perform_opt {
*place = target.project_deeper(&place.projection[1..], self.tcx);
self.any_replacement = true;
continue;
}
} }
break; let Value::Pointer(target, _) = self.targets[place.local] else { return };
let perform_opt = match ctxt {
PlaceContext::NonUse(NonUseContext::VarDebugInfo) => {
target.projection.iter().all(|p| p.can_use_in_debuginfo())
}
PlaceContext::NonUse(_) => true,
_ => self.allowed_replacements.contains(&(target.local, loc)),
};
if !perform_opt {
return;
}
*place = target.project_deeper(&place.projection[1..], self.tcx);
self.any_replacement = true;
} }
} }

View file

@ -33,7 +33,7 @@ pub fn iter_repeat_n_next(it: &mut std::iter::RepeatN<NotCopy>) -> Option<NotCop
// CHECK: [[EMPTY]]: // CHECK: [[EMPTY]]:
// CHECK-NOT: br // CHECK-NOT: br
// CHECK: phi i16 [ undef, %start ], [ %[[VAL]], %[[NOT_EMPTY]] ] // CHECK: phi i16 [ %[[VAL]], %[[NOT_EMPTY]] ], [ undef, %start ]
// CHECK-NOT: br // CHECK-NOT: br
// CHECK: ret // CHECK: ret

View file

@ -8,7 +8,7 @@ pub fn zero_sized_elem() {
// CHECK-NOT: br label %repeat_loop_header{{.*}} // CHECK-NOT: br label %repeat_loop_header{{.*}}
// CHECK-NOT: call void @llvm.memset.p0 // CHECK-NOT: call void @llvm.memset.p0
let x = [(); 4]; let x = [(); 4];
drop(&x); opaque(&x);
} }
// CHECK-LABEL: @zero_len_array // CHECK-LABEL: @zero_len_array
@ -17,7 +17,7 @@ pub fn zero_len_array() {
// CHECK-NOT: br label %repeat_loop_header{{.*}} // CHECK-NOT: br label %repeat_loop_header{{.*}}
// CHECK-NOT: call void @llvm.memset.p0 // CHECK-NOT: call void @llvm.memset.p0
let x = [4; 0]; let x = [4; 0];
drop(&x); opaque(&x);
} }
// CHECK-LABEL: @byte_array // CHECK-LABEL: @byte_array
@ -26,7 +26,7 @@ pub fn byte_array() {
// CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 7, i{{[0-9]+}} 4 // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 7, i{{[0-9]+}} 4
// CHECK-NOT: br label %repeat_loop_header{{.*}} // CHECK-NOT: br label %repeat_loop_header{{.*}}
let x = [7u8; 4]; let x = [7u8; 4];
drop(&x); opaque(&x);
} }
#[allow(dead_code)] #[allow(dead_code)]
@ -42,7 +42,7 @@ pub fn byte_enum_array() {
// CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 {{.*}}, i{{[0-9]+}} 4 // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 {{.*}}, i{{[0-9]+}} 4
// CHECK-NOT: br label %repeat_loop_header{{.*}} // CHECK-NOT: br label %repeat_loop_header{{.*}}
let x = [Init::Memset; 4]; let x = [Init::Memset; 4];
drop(&x); opaque(&x);
} }
// CHECK-LABEL: @zeroed_integer_array // CHECK-LABEL: @zeroed_integer_array
@ -51,7 +51,7 @@ pub fn zeroed_integer_array() {
// CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 0, i{{[0-9]+}} 16 // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 0, i{{[0-9]+}} 16
// CHECK-NOT: br label %repeat_loop_header{{.*}} // CHECK-NOT: br label %repeat_loop_header{{.*}}
let x = [0u32; 4]; let x = [0u32; 4];
drop(&x); opaque(&x);
} }
// CHECK-LABEL: @nonzero_integer_array // CHECK-LABEL: @nonzero_integer_array
@ -60,5 +60,9 @@ pub fn nonzero_integer_array() {
// CHECK: br label %repeat_loop_header{{.*}} // CHECK: br label %repeat_loop_header{{.*}}
// CHECK-NOT: call void @llvm.memset.p0 // CHECK-NOT: call void @llvm.memset.p0
let x = [0x1a_2b_3c_4d_u32; 4]; let x = [0x1a_2b_3c_4d_u32; 4];
drop(&x); opaque(&x);
} }
// Use an opaque function to prevent rustc from removing useless drops.
#[inline(never)]
pub fn opaque(_: impl Sized) {}

View file

@ -44,48 +44,48 @@ pub fn is_zero_array(data: &[u8; 4]) -> bool {
// equality for non-byte types also just emit a `bcmp`, not a loop. // equality for non-byte types also just emit a `bcmp`, not a loop.
// CHECK-LABEL: @eq_slice_of_nested_u8( // CHECK-LABEL: @eq_slice_of_nested_u8(
// CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %1 // CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %x.1
// CHECK-SAME: [[USIZE]] noundef %3 // CHECK-SAME: [[USIZE]] noundef %y.1
#[no_mangle] #[no_mangle]
fn eq_slice_of_nested_u8(x: &[[u8; 3]], y: &[[u8; 3]]) -> bool { fn eq_slice_of_nested_u8(x: &[[u8; 3]], y: &[[u8; 3]]) -> bool {
// CHECK: icmp eq [[USIZE]] %1, %3 // CHECK: icmp eq [[USIZE]] %x.1, %y.1
// CHECK: %[[BYTES:.+]] = mul nsw [[USIZE]] %1, 3 // CHECK: %[[BYTES:.+]] = mul nsw [[USIZE]] %x.1, 3
// CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i8\*|ptr}} // CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i8\*|ptr}}
// CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]]) // CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]])
x == y x == y
} }
// CHECK-LABEL: @eq_slice_of_i32( // CHECK-LABEL: @eq_slice_of_i32(
// CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %1 // CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %x.1
// CHECK-SAME: [[USIZE]] noundef %3 // CHECK-SAME: [[USIZE]] noundef %y.1
#[no_mangle] #[no_mangle]
fn eq_slice_of_i32(x: &[i32], y: &[i32]) -> bool { fn eq_slice_of_i32(x: &[i32], y: &[i32]) -> bool {
// CHECK: icmp eq [[USIZE]] %1, %3 // CHECK: icmp eq [[USIZE]] %x.1, %y.1
// CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %1, 2 // CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %x.1, 2
// CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i32\*|ptr}} // CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i32\*|ptr}}
// CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]]) // CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]])
x == y x == y
} }
// CHECK-LABEL: @eq_slice_of_nonzero( // CHECK-LABEL: @eq_slice_of_nonzero(
// CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %1 // CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %x.1
// CHECK-SAME: [[USIZE]] noundef %3 // CHECK-SAME: [[USIZE]] noundef %y.1
#[no_mangle] #[no_mangle]
fn eq_slice_of_nonzero(x: &[NonZeroU32], y: &[NonZeroU32]) -> bool { fn eq_slice_of_nonzero(x: &[NonZeroU32], y: &[NonZeroU32]) -> bool {
// CHECK: icmp eq [[USIZE]] %1, %3 // CHECK: icmp eq [[USIZE]] %x.1, %y.1
// CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %1, 2 // CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %x.1, 2
// CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i32\*|ptr}} // CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i32\*|ptr}}
// CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]]) // CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]])
x == y x == y
} }
// CHECK-LABEL: @eq_slice_of_option_of_nonzero( // CHECK-LABEL: @eq_slice_of_option_of_nonzero(
// CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %1 // CHECK-SAME: [[USIZE:i16|i32|i64]] noundef %x.1
// CHECK-SAME: [[USIZE]] noundef %3 // CHECK-SAME: [[USIZE]] noundef %y.1
#[no_mangle] #[no_mangle]
fn eq_slice_of_option_of_nonzero(x: &[Option<NonZeroI16>], y: &[Option<NonZeroI16>]) -> bool { fn eq_slice_of_option_of_nonzero(x: &[Option<NonZeroI16>], y: &[Option<NonZeroI16>]) -> bool {
// CHECK: icmp eq [[USIZE]] %1, %3 // CHECK: icmp eq [[USIZE]] %x.1, %y.1
// CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %1, 1 // CHECK: %[[BYTES:.+]] = shl nsw [[USIZE]] %x.1, 1
// CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i16\*|ptr}} // CHECK: tail call{{( noundef)?}} i32 @{{bcmp|memcmp}}({{i16\*|ptr}}
// CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]]) // CHECK-SAME: , [[USIZE]]{{( noundef)?}} %[[BYTES]])
x == y x == y

View file

@ -162,7 +162,7 @@ pub fn change_to_ufcs() {
} }
#[cfg(not(any(cfail1,cfail4)))] #[cfg(not(any(cfail1,cfail4)))]
#[rustc_clean(cfg="cfail2", except="hir_owner_nodes,optimized_mir,typeck")] #[rustc_clean(cfg="cfail2", except="hir_owner_nodes,typeck")]
#[rustc_clean(cfg="cfail3")] #[rustc_clean(cfg="cfail3")]
#[rustc_clean(cfg="cfail5", except="hir_owner_nodes,optimized_mir,typeck")] #[rustc_clean(cfg="cfail5", except="hir_owner_nodes,optimized_mir,typeck")]
#[rustc_clean(cfg="cfail6")] #[rustc_clean(cfg="cfail6")]

View file

@ -7,7 +7,7 @@
let mut _2: *const &u8; let mut _2: *const &u8;
let mut _3: *const &u8; let mut _3: *const &u8;
scope 1 (inlined generic_cast::<&u8, &u8>) { scope 1 (inlined generic_cast::<&u8, &u8>) {
debug x => _3; debug x => _1;
} }
bb0: { bb0: {

View file

@ -1,3 +1,5 @@
// unit-test: CopyProp
//
// This attempts to mutate `a` via a pointer derived from `addr_of!(a)`. That is UB // This attempts to mutate `a` via a pointer derived from `addr_of!(a)`. That is UB
// according to Miri. However, the decision to make this UB - and to allow // according to Miri. However, the decision to make this UB - and to allow
// rustc to rely on that fact for the purpose of optimizations - has not been // rustc to rely on that fact for the purpose of optimizations - has not been

View file

@ -7,8 +7,7 @@
let mut _2: std::option::Option<T>; let mut _2: std::option::Option<T>;
+ scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) { + scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) {
+ debug self => _2; + debug self => _2;
+ let mut _3: &std::option::Option<T>; + let mut _3: isize;
+ let mut _4: isize;
+ scope 2 { + scope 2 {
+ debug val => _0; + debug val => _0;
+ } + }
@ -21,7 +20,7 @@
+ } + }
+ } + }
+ scope 4 (inlined Option::<T>::is_some) { + scope 4 (inlined Option::<T>::is_some) {
+ debug self => _3; + debug self => &_2;
+ } + }
+ } + }
@ -29,9 +28,8 @@
StorageLive(_2); StorageLive(_2);
_2 = move _1; _2 = move _1;
- _0 = Option::<T>::unwrap_unchecked(move _2) -> [return: bb1, unwind unreachable]; - _0 = Option::<T>::unwrap_unchecked(move _2) -> [return: bb1, unwind unreachable];
+ StorageLive(_3); + _3 = discriminant(_2);
+ _4 = discriminant(_2); + switchInt(move _3) -> [1: bb2, otherwise: bb1];
+ switchInt(move _4) -> [1: bb2, otherwise: bb1];
} }
bb1: { bb1: {
@ -40,7 +38,6 @@
+ +
+ bb2: { + bb2: {
+ _0 = move ((_2 as Some).0: T); + _0 = move ((_2 as Some).0: T);
+ StorageDead(_3);
StorageDead(_2); StorageDead(_2);
return; return;
} }

View file

@ -7,8 +7,7 @@
let mut _2: std::option::Option<T>; let mut _2: std::option::Option<T>;
+ scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) { + scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) {
+ debug self => _2; + debug self => _2;
+ let mut _3: &std::option::Option<T>; + let mut _3: isize;
+ let mut _4: isize;
+ scope 2 { + scope 2 {
+ debug val => _0; + debug val => _0;
+ } + }
@ -21,7 +20,7 @@
+ } + }
+ } + }
+ scope 4 (inlined Option::<T>::is_some) { + scope 4 (inlined Option::<T>::is_some) {
+ debug self => _3; + debug self => &_2;
+ } + }
+ } + }
@ -29,9 +28,8 @@
StorageLive(_2); StorageLive(_2);
_2 = move _1; _2 = move _1;
- _0 = Option::<T>::unwrap_unchecked(move _2) -> [return: bb1, unwind: bb2]; - _0 = Option::<T>::unwrap_unchecked(move _2) -> [return: bb1, unwind: bb2];
+ StorageLive(_3); + _3 = discriminant(_2);
+ _4 = discriminant(_2); + switchInt(move _3) -> [1: bb2, otherwise: bb1];
+ switchInt(move _4) -> [1: bb2, otherwise: bb1];
} }
bb1: { bb1: {
@ -44,7 +42,6 @@
- resume; - resume;
+ bb2: { + bb2: {
+ _0 = move ((_2 as Some).0: T); + _0 = move ((_2 as Some).0: T);
+ StorageDead(_3);
+ StorageDead(_2); + StorageDead(_2);
+ return; + return;
} }

View file

@ -6,7 +6,6 @@ fn unwrap_unchecked(_1: Option<T>) -> T {
scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) { scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) {
debug self => _1; debug self => _1;
let mut _2: isize; let mut _2: isize;
let mut _3: &std::option::Option<T>;
scope 2 { scope 2 {
debug val => _0; debug val => _0;
} }
@ -19,19 +18,17 @@ fn unwrap_unchecked(_1: Option<T>) -> T {
} }
} }
scope 4 (inlined Option::<T>::is_some) { scope 4 (inlined Option::<T>::is_some) {
debug self => _3; debug self => &_1;
} }
} }
bb0: { bb0: {
StorageLive(_3);
_2 = discriminant(_1); _2 = discriminant(_1);
switchInt(move _2) -> [1: bb1, otherwise: bb2]; switchInt(move _2) -> [1: bb1, otherwise: bb2];
} }
bb1: { bb1: {
_0 = move ((_1 as Some).0: T); _0 = move ((_1 as Some).0: T);
StorageDead(_3);
return; return;
} }

View file

@ -6,7 +6,6 @@ fn unwrap_unchecked(_1: Option<T>) -> T {
scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) { scope 1 (inlined #[track_caller] Option::<T>::unwrap_unchecked) {
debug self => _1; debug self => _1;
let mut _2: isize; let mut _2: isize;
let mut _3: &std::option::Option<T>;
scope 2 { scope 2 {
debug val => _0; debug val => _0;
} }
@ -19,19 +18,17 @@ fn unwrap_unchecked(_1: Option<T>) -> T {
} }
} }
scope 4 (inlined Option::<T>::is_some) { scope 4 (inlined Option::<T>::is_some) {
debug self => _3; debug self => &_1;
} }
} }
bb0: { bb0: {
StorageLive(_3);
_2 = discriminant(_1); _2 = discriminant(_1);
switchInt(move _2) -> [1: bb1, otherwise: bb2]; switchInt(move _2) -> [1: bb1, otherwise: bb2];
} }
bb1: { bb1: {
_0 = move ((_1 as Some).0: T); _0 = move ((_1 as Some).0: T);
StorageDead(_3);
return; return;
} }

View file

@ -6,20 +6,16 @@
let mut _0: (); let mut _0: ();
let _2: &[T]; let _2: &[T];
let mut _3: &[T; 3]; let mut _3: &[T; 3];
let _4: &[T; 3]; let _4: [T; 3];
let _5: [T; 3]; let mut _5: T;
let mut _6: T; let mut _6: T;
let mut _7: T; let mut _7: T;
let mut _8: T; let mut _8: usize;
let mut _9: usize; let mut _9: usize;
let mut _10: usize; let mut _10: bool;
let mut _11: bool; let mut _11: !;
let mut _15: !;
scope 1 { scope 1 {
debug v => _2; debug v => _2;
let _12: &T;
let _13: &T;
let _14: &T;
scope 2 { scope 2 {
debug v1 => &(*_2)[0 of 3]; debug v1 => &(*_2)[0 of 3];
debug v2 => &(*_2)[1 of 3]; debug v2 => &(*_2)[1 of 3];
@ -28,26 +24,26 @@
} }
bb0: { bb0: {
StorageLive(_2); StorageLive(_3);
StorageLive(_5); StorageLive(_4);
_5 = [_1, _1, _1]; _4 = [_1, _1, _1];
_4 = &_5; _3 = &_4;
_2 = _4 as &[T] (PointerCoercion(Unsize)); _2 = move _3 as &[T] (PointerCoercion(Unsize));
_9 = Len((*_2)); StorageDead(_3);
_10 = const 3_usize; _8 = Len((*_2));
- _11 = Eq(move _9, const 3_usize); _9 = const 3_usize;
- switchInt(move _11) -> [0: bb1, otherwise: bb2]; - _10 = Eq(move _8, const 3_usize);
- switchInt(move _10) -> [0: bb1, otherwise: bb2];
+ nop; + nop;
+ switchInt(move _9) -> [3: bb2, otherwise: bb1]; + switchInt(move _8) -> [3: bb2, otherwise: bb1];
} }
bb1: { bb1: {
_15 = core::panicking::panic(const "internal error: entered unreachable code") -> unwind unreachable; _11 = core::panicking::panic(const "internal error: entered unreachable code") -> unwind unreachable;
} }
bb2: { bb2: {
StorageDead(_5); StorageDead(_4);
StorageDead(_2);
return; return;
} }
} }

View file

@ -6,20 +6,16 @@
let mut _0: (); let mut _0: ();
let _2: &[T]; let _2: &[T];
let mut _3: &[T; 3]; let mut _3: &[T; 3];
let _4: &[T; 3]; let _4: [T; 3];
let _5: [T; 3]; let mut _5: T;
let mut _6: T; let mut _6: T;
let mut _7: T; let mut _7: T;
let mut _8: T; let mut _8: usize;
let mut _9: usize; let mut _9: usize;
let mut _10: usize; let mut _10: bool;
let mut _11: bool; let mut _11: !;
let mut _15: !;
scope 1 { scope 1 {
debug v => _2; debug v => _2;
let _12: &T;
let _13: &T;
let _14: &T;
scope 2 { scope 2 {
debug v1 => &(*_2)[0 of 3]; debug v1 => &(*_2)[0 of 3];
debug v2 => &(*_2)[1 of 3]; debug v2 => &(*_2)[1 of 3];
@ -28,26 +24,26 @@
} }
bb0: { bb0: {
StorageLive(_2); StorageLive(_3);
StorageLive(_5); StorageLive(_4);
_5 = [_1, _1, _1]; _4 = [_1, _1, _1];
_4 = &_5; _3 = &_4;
_2 = _4 as &[T] (PointerCoercion(Unsize)); _2 = move _3 as &[T] (PointerCoercion(Unsize));
_9 = Len((*_2)); StorageDead(_3);
_10 = const 3_usize; _8 = Len((*_2));
- _11 = Eq(move _9, const 3_usize); _9 = const 3_usize;
- switchInt(move _11) -> [0: bb1, otherwise: bb2]; - _10 = Eq(move _8, const 3_usize);
- switchInt(move _10) -> [0: bb1, otherwise: bb2];
+ nop; + nop;
+ switchInt(move _9) -> [3: bb2, otherwise: bb1]; + switchInt(move _8) -> [3: bb2, otherwise: bb1];
} }
bb1: { bb1: {
_15 = core::panicking::panic(const "internal error: entered unreachable code") -> unwind continue; _11 = core::panicking::panic(const "internal error: entered unreachable code") -> unwind continue;
} }
bb2: { bb2: {
StorageDead(_5); StorageDead(_4);
StorageDead(_2);
return; return;
} }
} }

View file

@ -3,57 +3,53 @@
fn num_to_digit(_1: char) -> u32 { fn num_to_digit(_1: char) -> u32 {
debug num => _1; debug num => _1;
let mut _0: u32; let mut _0: u32;
let mut _5: std::option::Option<u32>; let mut _4: std::option::Option<u32>;
scope 1 (inlined char::methods::<impl char>::is_digit) { scope 1 (inlined char::methods::<impl char>::is_digit) {
debug self => _1; debug self => _1;
debug radix => const 8_u32; debug radix => const 8_u32;
let _2: std::option::Option<u32>; let _2: std::option::Option<u32>;
let mut _3: &std::option::Option<u32>;
scope 2 (inlined Option::<u32>::is_some) { scope 2 (inlined Option::<u32>::is_some) {
debug self => _3; debug self => &_2;
let mut _4: isize; let mut _3: isize;
} }
} }
scope 3 (inlined #[track_caller] Option::<u32>::unwrap) { scope 3 (inlined #[track_caller] Option::<u32>::unwrap) {
debug self => _5; debug self => _4;
let mut _6: isize; let mut _5: isize;
let mut _7: !; let mut _6: !;
scope 4 { scope 4 {
debug val => _0; debug val => _0;
} }
} }
bb0: { bb0: {
StorageLive(_3);
StorageLive(_2); StorageLive(_2);
_2 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb1, unwind unreachable]; _2 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb1, unwind unreachable];
} }
bb1: { bb1: {
_3 = &_2; _3 = discriminant(_2);
_4 = discriminant((*_3));
StorageDead(_3);
StorageDead(_2); StorageDead(_2);
switchInt(move _4) -> [1: bb2, otherwise: bb7]; switchInt(move _3) -> [1: bb2, otherwise: bb7];
} }
bb2: { bb2: {
StorageLive(_5); StorageLive(_4);
_5 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb3, unwind unreachable]; _4 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb3, unwind unreachable];
} }
bb3: { bb3: {
_6 = discriminant(_5); _5 = discriminant(_4);
switchInt(move _6) -> [0: bb4, 1: bb5, otherwise: bb6]; switchInt(move _5) -> [0: bb4, 1: bb5, otherwise: bb6];
} }
bb4: { bb4: {
_7 = core::panicking::panic(const "called `Option::unwrap()` on a `None` value") -> unwind unreachable; _6 = core::panicking::panic(const "called `Option::unwrap()` on a `None` value") -> unwind unreachable;
} }
bb5: { bb5: {
_0 = move ((_5 as Some).0: u32); _0 = move ((_4 as Some).0: u32);
StorageDead(_5); StorageDead(_4);
goto -> bb8; goto -> bb8;
} }

View file

@ -3,57 +3,53 @@
fn num_to_digit(_1: char) -> u32 { fn num_to_digit(_1: char) -> u32 {
debug num => _1; debug num => _1;
let mut _0: u32; let mut _0: u32;
let mut _5: std::option::Option<u32>; let mut _4: std::option::Option<u32>;
scope 1 (inlined char::methods::<impl char>::is_digit) { scope 1 (inlined char::methods::<impl char>::is_digit) {
debug self => _1; debug self => _1;
debug radix => const 8_u32; debug radix => const 8_u32;
let _2: std::option::Option<u32>; let _2: std::option::Option<u32>;
let mut _3: &std::option::Option<u32>;
scope 2 (inlined Option::<u32>::is_some) { scope 2 (inlined Option::<u32>::is_some) {
debug self => _3; debug self => &_2;
let mut _4: isize; let mut _3: isize;
} }
} }
scope 3 (inlined #[track_caller] Option::<u32>::unwrap) { scope 3 (inlined #[track_caller] Option::<u32>::unwrap) {
debug self => _5; debug self => _4;
let mut _6: isize; let mut _5: isize;
let mut _7: !; let mut _6: !;
scope 4 { scope 4 {
debug val => _0; debug val => _0;
} }
} }
bb0: { bb0: {
StorageLive(_3);
StorageLive(_2); StorageLive(_2);
_2 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb1, unwind continue]; _2 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb1, unwind continue];
} }
bb1: { bb1: {
_3 = &_2; _3 = discriminant(_2);
_4 = discriminant((*_3));
StorageDead(_3);
StorageDead(_2); StorageDead(_2);
switchInt(move _4) -> [1: bb2, otherwise: bb7]; switchInt(move _3) -> [1: bb2, otherwise: bb7];
} }
bb2: { bb2: {
StorageLive(_5); StorageLive(_4);
_5 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb3, unwind continue]; _4 = char::methods::<impl char>::to_digit(_1, const 8_u32) -> [return: bb3, unwind continue];
} }
bb3: { bb3: {
_6 = discriminant(_5); _5 = discriminant(_4);
switchInt(move _6) -> [0: bb4, 1: bb5, otherwise: bb6]; switchInt(move _5) -> [0: bb4, 1: bb5, otherwise: bb6];
} }
bb4: { bb4: {
_7 = core::panicking::panic(const "called `Option::unwrap()` on a `None` value") -> unwind continue; _6 = core::panicking::panic(const "called `Option::unwrap()` on a `None` value") -> unwind continue;
} }
bb5: { bb5: {
_0 = move ((_5 as Some).0: u32); _0 = move ((_4 as Some).0: u32);
StorageDead(_5); StorageDead(_4);
goto -> bb8; goto -> bb8;
} }

View file

@ -8,42 +8,38 @@ fn step_forward(_1: u32, _2: usize) -> u32 {
debug start => _1; debug start => _1;
debug n => _2; debug n => _2;
let _3: std::option::Option<u32>; let _3: std::option::Option<u32>;
let mut _4: &std::option::Option<u32>; let mut _6: bool;
let mut _7: bool; let mut _7: u32;
let mut _8: u32;
scope 2 { scope 2 {
} }
scope 3 (inlined Option::<u32>::is_none) { scope 3 (inlined Option::<u32>::is_none) {
debug self => _4; debug self => &_3;
let mut _6: bool; let mut _5: bool;
scope 4 (inlined Option::<u32>::is_some) { scope 4 (inlined Option::<u32>::is_some) {
debug self => _4; debug self => &_3;
let mut _5: isize; let mut _4: isize;
} }
} }
scope 5 (inlined core::num::<impl u32>::wrapping_add) { scope 5 (inlined core::num::<impl u32>::wrapping_add) {
debug self => _1; debug self => _1;
debug rhs => _8; debug rhs => _7;
} }
} }
bb0: { bb0: {
StorageLive(_7); StorageLive(_6);
StorageLive(_4);
StorageLive(_3); StorageLive(_3);
_3 = <u32 as Step>::forward_checked(_1, _2) -> [return: bb1, unwind continue]; _3 = <u32 as Step>::forward_checked(_1, _2) -> [return: bb1, unwind continue];
} }
bb1: { bb1: {
_4 = &_3; StorageLive(_5);
StorageLive(_6); _4 = discriminant(_3);
_5 = discriminant((*_4)); _5 = Eq(_4, const 1_isize);
_6 = Eq(_5, const 1_isize); _6 = Not(move _5);
_7 = Not(move _6); StorageDead(_5);
StorageDead(_6);
StorageDead(_3); StorageDead(_3);
StorageDead(_4); switchInt(move _6) -> [0: bb3, otherwise: bb2];
switchInt(move _7) -> [0: bb3, otherwise: bb2];
} }
bb2: { bb2: {
@ -51,11 +47,11 @@ fn step_forward(_1: u32, _2: usize) -> u32 {
} }
bb3: { bb3: {
StorageDead(_6);
StorageLive(_7);
_7 = _2 as u32 (IntToInt);
_0 = Add(_1, _7);
StorageDead(_7); StorageDead(_7);
StorageLive(_8);
_8 = _2 as u32 (IntToInt);
_0 = Add(_1, _8);
StorageDead(_8);
return; return;
} }
} }

View file

@ -7,20 +7,19 @@ fn filter_mapped(_1: impl Iterator<Item = T>, _2: impl Fn(T) -> Option<U>) -> ()
let mut _3: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>; let mut _3: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>;
let mut _4: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>; let mut _4: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>;
let mut _5: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>; let mut _5: std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>;
let mut _6: &mut std::iter::FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>>; let mut _8: std::option::Option<U>;
let mut _9: std::option::Option<U>; let mut _9: isize;
let mut _10: isize; let _11: ();
let _12: ();
scope 1 { scope 1 {
debug iter => _5; debug iter => _5;
let _11: U; let _10: U;
scope 2 { scope 2 {
debug x => _11; debug x => _10;
} }
scope 4 (inlined <FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>> as Iterator>::next) { scope 4 (inlined <FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>> as Iterator>::next) {
debug self => _6; debug self => &_5;
let mut _7: &mut impl Iterator<Item = T>; let mut _6: &mut impl Iterator<Item = T>;
let mut _8: &mut impl Fn(T) -> Option<U>; let mut _7: &mut impl Fn(T) -> Option<U>;
} }
} }
scope 3 (inlined <FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>> as IntoIterator>::into_iter) { scope 3 (inlined <FilterMap<impl Iterator<Item = T>, impl Fn(T) -> Option<U>> as IntoIterator>::into_iter) {
@ -42,24 +41,23 @@ fn filter_mapped(_1: impl Iterator<Item = T>, _2: impl Fn(T) -> Option<U>) -> ()
} }
bb2: { bb2: {
StorageLive(_9);
_6 = &mut _5;
StorageLive(_7);
_7 = &mut ((*_6).0: impl Iterator<Item = T>);
StorageLive(_8); StorageLive(_8);
_8 = &mut ((*_6).1: impl Fn(T) -> Option<U>); StorageLive(_6);
_9 = <impl Iterator<Item = T> as Iterator>::find_map::<U, &mut impl Fn(T) -> Option<U>>(move _7, move _8) -> [return: bb3, unwind: bb9]; _6 = &mut (_5.0: impl Iterator<Item = T>);
StorageLive(_7);
_7 = &mut (_5.1: impl Fn(T) -> Option<U>);
_8 = <impl Iterator<Item = T> as Iterator>::find_map::<U, &mut impl Fn(T) -> Option<U>>(move _6, move _7) -> [return: bb3, unwind: bb9];
} }
bb3: { bb3: {
StorageDead(_8);
StorageDead(_7); StorageDead(_7);
_10 = discriminant(_9); StorageDead(_6);
switchInt(move _10) -> [0: bb4, 1: bb6, otherwise: bb8]; _9 = discriminant(_8);
switchInt(move _9) -> [0: bb4, 1: bb6, otherwise: bb8];
} }
bb4: { bb4: {
StorageDead(_9); StorageDead(_8);
drop(_5) -> [return: bb5, unwind continue]; drop(_5) -> [return: bb5, unwind continue];
} }
@ -70,12 +68,12 @@ fn filter_mapped(_1: impl Iterator<Item = T>, _2: impl Fn(T) -> Option<U>) -> ()
} }
bb6: { bb6: {
_11 = move ((_9 as Some).0: U); _10 = move ((_8 as Some).0: U);
_12 = opaque::<U>(move _11) -> [return: bb7, unwind: bb9]; _11 = opaque::<U>(move _10) -> [return: bb7, unwind: bb9];
} }
bb7: { bb7: {
StorageDead(_9); StorageDead(_8);
goto -> bb2; goto -> bb2;
} }

View file

@ -4,111 +4,95 @@ fn int_range(_1: usize, _2: usize) -> () {
debug start => _1; debug start => _1;
debug end => _2; debug end => _2;
let mut _0: (); let mut _0: ();
let mut _3: std::ops::Range<usize>; let mut _3: usize;
let mut _4: std::ops::Range<usize>; let mut _6: std::option::Option<usize>;
let mut _5: &mut std::ops::Range<usize>; let mut _9: isize;
let mut _11: std::option::Option<usize>; let _11: ();
let mut _14: isize;
let _16: ();
scope 1 { scope 1 {
debug iter => _4; debug iter => std::ops::Range<usize>{ .0 => _3, .1 => _2, };
let _15: usize; let _10: usize;
scope 2 { scope 2 {
debug i => _15; debug i => _10;
} }
scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) { scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
debug self => _5; debug self => &std::ops::Range<usize>{ .0 => _3, .1 => _2, };
scope 5 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) { scope 5 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _5; debug self => &std::ops::Range<usize>{ .0 => _3, .1 => _2, };
let mut _6: &usize; let mut _5: bool;
let mut _7: &usize; let _7: usize;
let mut _10: bool; let mut _8: usize;
let _12: usize;
let mut _13: usize;
scope 6 { scope 6 {
debug old => _12; debug old => _7;
scope 7 { scope 7 {
} }
} }
scope 8 (inlined cmp::impls::<impl PartialOrd for usize>::lt) { scope 8 (inlined cmp::impls::<impl PartialOrd for usize>::lt) {
debug self => _6; debug self => &_3;
debug other => _7; debug other => &_2;
let mut _8: usize; let mut _4: usize;
let mut _9: usize;
} }
} }
} }
} }
scope 3 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) { scope 3 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) {
debug self => _3; debug self => std::ops::Range<usize>{ .0 => _1, .1 => _2, };
} }
bb0: { bb0: {
_3 = std::ops::Range::<usize> { start: _1, end: _2 }; StorageLive(_3);
StorageLive(_4); _3 = _1;
_4 = move _3;
goto -> bb1; goto -> bb1;
} }
bb1: { bb1: {
StorageLive(_11);
_5 = &mut _4;
StorageLive(_12);
StorageLive(_10);
StorageLive(_6); StorageLive(_6);
_6 = &((*_5).0: usize);
StorageLive(_7); StorageLive(_7);
_7 = &((*_5).1: usize); StorageLive(_5);
StorageLive(_8); StorageLive(_4);
_8 = (*_6); _4 = _3;
StorageLive(_9); _5 = Lt(move _4, _2);
_9 = (*_7); StorageDead(_4);
_10 = Lt(move _8, move _9); switchInt(move _5) -> [0: bb2, otherwise: bb3];
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
StorageDead(_6);
switchInt(move _10) -> [0: bb2, otherwise: bb3];
} }
bb2: { bb2: {
_11 = Option::<usize>::None; _6 = Option::<usize>::None;
goto -> bb5; goto -> bb5;
} }
bb3: { bb3: {
_12 = ((*_5).0: usize); _7 = _3;
StorageLive(_13); StorageLive(_8);
_13 = <usize as Step>::forward_unchecked(_12, const 1_usize) -> [return: bb4, unwind continue]; _8 = <usize as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb4, unwind continue];
} }
bb4: { bb4: {
((*_5).0: usize) = move _13; _3 = move _8;
StorageDead(_13); StorageDead(_8);
_11 = Option::<usize>::Some(_12); _6 = Option::<usize>::Some(_7);
goto -> bb5; goto -> bb5;
} }
bb5: { bb5: {
StorageDead(_10); StorageDead(_5);
StorageDead(_12); StorageDead(_7);
_14 = discriminant(_11); _9 = discriminant(_6);
switchInt(move _14) -> [0: bb6, 1: bb7, otherwise: bb9]; switchInt(move _9) -> [0: bb6, 1: bb7, otherwise: bb9];
} }
bb6: { bb6: {
StorageDead(_11); StorageDead(_6);
StorageDead(_4); StorageDead(_3);
return; return;
} }
bb7: { bb7: {
_15 = ((_11 as Some).0: usize); _10 = ((_6 as Some).0: usize);
_16 = opaque::<usize>(_15) -> [return: bb8, unwind continue]; _11 = opaque::<usize>(_10) -> [return: bb8, unwind continue];
} }
bb8: { bb8: {
StorageDead(_11); StorageDead(_6);
goto -> bb1; goto -> bb1;
} }

View file

@ -38,11 +38,13 @@ fn mapped(_1: impl Iterator<Item = T>, _2: impl Fn(T) -> U) -> () {
bb2: { bb2: {
StorageLive(_7); StorageLive(_7);
StorageLive(_6);
_6 = &mut _5; _6 = &mut _5;
_7 = <Map<impl Iterator<Item = T>, impl Fn(T) -> U> as Iterator>::next(_6) -> [return: bb3, unwind: bb9]; _7 = <Map<impl Iterator<Item = T>, impl Fn(T) -> U> as Iterator>::next(move _6) -> [return: bb3, unwind: bb9];
} }
bb3: { bb3: {
StorageDead(_6);
_8 = discriminant(_7); _8 = discriminant(_7);
switchInt(move _8) -> [0: bb4, 1: bb6, otherwise: bb8]; switchInt(move _8) -> [0: bb4, 1: bb6, otherwise: bb8];
} }

View file

@ -30,11 +30,13 @@ fn vec_move(_1: Vec<impl Sized>) -> () {
bb2: { bb2: {
StorageLive(_5); StorageLive(_5);
StorageLive(_4);
_4 = &mut _3; _4 = &mut _3;
_5 = <std::vec::IntoIter<impl Sized> as Iterator>::next(_4) -> [return: bb3, unwind: bb9]; _5 = <std::vec::IntoIter<impl Sized> as Iterator>::next(move _4) -> [return: bb3, unwind: bb9];
} }
bb3: { bb3: {
StorageDead(_4);
_6 = discriminant(_5); _6 = discriminant(_5);
switchInt(move _6) -> [0: bb4, 1: bb6, otherwise: bb8]; switchInt(move _6) -> [0: bb4, 1: bb6, otherwise: bb8];
} }

View file

@ -7,26 +7,24 @@ fn mem_replace(_1: &mut u32, _2: u32) -> u32 {
scope 1 (inlined std::mem::replace::<u32>) { scope 1 (inlined std::mem::replace::<u32>) {
debug dest => _1; debug dest => _1;
debug src => _2; debug src => _2;
let mut _3: *const u32;
let mut _4: *mut u32;
scope 2 { scope 2 {
scope 3 { scope 3 {
debug result => _0; debug result => _0;
scope 7 (inlined std::ptr::write::<u32>) { scope 7 (inlined std::ptr::write::<u32>) {
debug dst => _4; debug dst => _1;
debug src => _2; debug src => _2;
scope 8 { scope 8 {
scope 9 (inlined std::ptr::write::runtime::<u32>) { scope 9 (inlined std::ptr::write::runtime::<u32>) {
debug dst => _4; debug dst => _1;
} }
} }
} }
} }
scope 4 (inlined std::ptr::read::<u32>) { scope 4 (inlined std::ptr::read::<u32>) {
debug src => _3; debug src => _1;
scope 5 { scope 5 {
scope 6 (inlined std::ptr::read::runtime::<u32>) { scope 6 (inlined std::ptr::read::runtime::<u32>) {
debug src => _3; debug src => _1;
} }
} }
} }
@ -34,14 +32,8 @@ fn mem_replace(_1: &mut u32, _2: u32) -> u32 {
} }
bb0: { bb0: {
StorageLive(_3); _0 = (*_1);
_3 = &raw const (*_1); (*_1) = _2;
_0 = (*_3);
StorageDead(_3);
StorageLive(_4);
_4 = &raw mut (*_1);
(*_4) = _2;
StorageDead(_4);
return; return;
} }
} }

View file

@ -5,103 +5,87 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
debug end => _2; debug end => _2;
debug f => _3; debug f => _3;
let mut _0: (); let mut _0: ();
let mut _4: std::ops::Range<u32>; let mut _4: u32;
let mut _5: std::ops::Range<u32>; let mut _7: std::option::Option<u32>;
let mut _6: &mut std::ops::Range<u32>; let mut _10: isize;
let mut _12: std::option::Option<u32>; let mut _12: &impl Fn(u32);
let mut _15: isize; let mut _13: (u32,);
let mut _17: &impl Fn(u32); let _14: ();
let mut _18: (u32,);
let _19: ();
scope 1 { scope 1 {
debug iter => _5; debug iter => std::ops::Range<u32>{ .0 => _4, .1 => _2, };
let _16: u32; let _11: u32;
scope 2 { scope 2 {
debug x => _16; debug x => _11;
} }
scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) { scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) {
debug self => _6; debug self => &std::ops::Range<u32>{ .0 => _4, .1 => _2, };
scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) { scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _6; debug self => &std::ops::Range<u32>{ .0 => _4, .1 => _2, };
let mut _7: &u32; let mut _6: bool;
let mut _8: &u32; let _8: u32;
let mut _11: bool; let mut _9: u32;
let _13: u32;
let mut _14: u32;
scope 6 { scope 6 {
debug old => _13; debug old => _8;
scope 7 { scope 7 {
} }
} }
scope 8 (inlined cmp::impls::<impl PartialOrd for u32>::lt) { scope 8 (inlined cmp::impls::<impl PartialOrd for u32>::lt) {
debug self => _7; debug self => &_4;
debug other => _8; debug other => &_2;
let mut _9: u32; let mut _5: u32;
let mut _10: u32;
} }
} }
} }
} }
scope 3 (inlined <std::ops::Range<u32> as IntoIterator>::into_iter) { scope 3 (inlined <std::ops::Range<u32> as IntoIterator>::into_iter) {
debug self => _4; debug self => std::ops::Range<u32>{ .0 => _1, .1 => _2, };
} }
bb0: { bb0: {
_4 = std::ops::Range::<u32> { start: _1, end: _2 }; StorageLive(_4);
StorageLive(_5); _4 = _1;
_5 = move _4;
goto -> bb1; goto -> bb1;
} }
bb1: { bb1: {
StorageLive(_12);
_6 = &mut _5;
StorageLive(_13);
StorageLive(_11);
StorageLive(_7); StorageLive(_7);
_7 = &((*_6).0: u32);
StorageLive(_8); StorageLive(_8);
_8 = &((*_6).1: u32); StorageLive(_6);
StorageLive(_9); StorageLive(_5);
_9 = (*_7); _5 = _4;
StorageLive(_10); _6 = Lt(move _5, _2);
_10 = (*_8); StorageDead(_5);
_11 = Lt(move _9, move _10); switchInt(move _6) -> [0: bb2, otherwise: bb3];
StorageDead(_10);
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
switchInt(move _11) -> [0: bb2, otherwise: bb3];
} }
bb2: { bb2: {
_12 = Option::<u32>::None; _7 = Option::<u32>::None;
goto -> bb5; goto -> bb5;
} }
bb3: { bb3: {
_13 = ((*_6).0: u32); _8 = _4;
StorageLive(_14); StorageLive(_9);
_14 = <u32 as Step>::forward_unchecked(_13, const 1_usize) -> [return: bb4, unwind unreachable]; _9 = <u32 as Step>::forward_unchecked(_8, const 1_usize) -> [return: bb4, unwind unreachable];
} }
bb4: { bb4: {
((*_6).0: u32) = move _14; _4 = move _9;
StorageDead(_14); StorageDead(_9);
_12 = Option::<u32>::Some(_13); _7 = Option::<u32>::Some(_8);
goto -> bb5; goto -> bb5;
} }
bb5: { bb5: {
StorageDead(_11); StorageDead(_6);
StorageDead(_13); StorageDead(_8);
_15 = discriminant(_12); _10 = discriminant(_7);
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _10) -> [0: bb6, 1: bb8, otherwise: bb10];
} }
bb6: { bb6: {
StorageDead(_12); StorageDead(_7);
StorageDead(_5); StorageDead(_4);
drop(_3) -> [return: bb7, unwind unreachable]; drop(_3) -> [return: bb7, unwind unreachable];
} }
@ -110,18 +94,18 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
} }
bb8: { bb8: {
_16 = ((_12 as Some).0: u32); _11 = ((_7 as Some).0: u32);
StorageLive(_17); StorageLive(_12);
_17 = &_3; _12 = &_3;
StorageLive(_18); StorageLive(_13);
_18 = (_16,); _13 = (_11,);
_19 = <impl Fn(u32) as Fn<(u32,)>>::call(move _17, move _18) -> [return: bb9, unwind unreachable]; _14 = <impl Fn(u32) as Fn<(u32,)>>::call(move _12, move _13) -> [return: bb9, unwind unreachable];
} }
bb9: { bb9: {
StorageDead(_18); StorageDead(_13);
StorageDead(_17);
StorageDead(_12); StorageDead(_12);
StorageDead(_7);
goto -> bb1; goto -> bb1;
} }

View file

@ -5,103 +5,87 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
debug end => _2; debug end => _2;
debug f => _3; debug f => _3;
let mut _0: (); let mut _0: ();
let mut _4: std::ops::Range<u32>; let mut _4: u32;
let mut _5: std::ops::Range<u32>; let mut _7: std::option::Option<u32>;
let mut _6: &mut std::ops::Range<u32>; let mut _10: isize;
let mut _12: std::option::Option<u32>; let mut _12: &impl Fn(u32);
let mut _15: isize; let mut _13: (u32,);
let mut _17: &impl Fn(u32); let _14: ();
let mut _18: (u32,);
let _19: ();
scope 1 { scope 1 {
debug iter => _5; debug iter => std::ops::Range<u32>{ .0 => _4, .1 => _2, };
let _16: u32; let _11: u32;
scope 2 { scope 2 {
debug x => _16; debug x => _11;
} }
scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) { scope 4 (inlined iter::range::<impl Iterator for std::ops::Range<u32>>::next) {
debug self => _6; debug self => &std::ops::Range<u32>{ .0 => _4, .1 => _2, };
scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) { scope 5 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _6; debug self => &std::ops::Range<u32>{ .0 => _4, .1 => _2, };
let mut _7: &u32; let mut _6: bool;
let mut _8: &u32; let _8: u32;
let mut _11: bool; let mut _9: u32;
let _13: u32;
let mut _14: u32;
scope 6 { scope 6 {
debug old => _13; debug old => _8;
scope 7 { scope 7 {
} }
} }
scope 8 (inlined cmp::impls::<impl PartialOrd for u32>::lt) { scope 8 (inlined cmp::impls::<impl PartialOrd for u32>::lt) {
debug self => _7; debug self => &_4;
debug other => _8; debug other => &_2;
let mut _9: u32; let mut _5: u32;
let mut _10: u32;
} }
} }
} }
} }
scope 3 (inlined <std::ops::Range<u32> as IntoIterator>::into_iter) { scope 3 (inlined <std::ops::Range<u32> as IntoIterator>::into_iter) {
debug self => _4; debug self => std::ops::Range<u32>{ .0 => _1, .1 => _2, };
} }
bb0: { bb0: {
_4 = std::ops::Range::<u32> { start: _1, end: _2 }; StorageLive(_4);
StorageLive(_5); _4 = _1;
_5 = move _4;
goto -> bb1; goto -> bb1;
} }
bb1: { bb1: {
StorageLive(_12);
_6 = &mut _5;
StorageLive(_13);
StorageLive(_11);
StorageLive(_7); StorageLive(_7);
_7 = &((*_6).0: u32);
StorageLive(_8); StorageLive(_8);
_8 = &((*_6).1: u32); StorageLive(_6);
StorageLive(_9); StorageLive(_5);
_9 = (*_7); _5 = _4;
StorageLive(_10); _6 = Lt(move _5, _2);
_10 = (*_8); StorageDead(_5);
_11 = Lt(move _9, move _10); switchInt(move _6) -> [0: bb2, otherwise: bb3];
StorageDead(_10);
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
switchInt(move _11) -> [0: bb2, otherwise: bb3];
} }
bb2: { bb2: {
_12 = Option::<u32>::None; _7 = Option::<u32>::None;
goto -> bb5; goto -> bb5;
} }
bb3: { bb3: {
_13 = ((*_6).0: u32); _8 = _4;
StorageLive(_14); StorageLive(_9);
_14 = <u32 as Step>::forward_unchecked(_13, const 1_usize) -> [return: bb4, unwind: bb11]; _9 = <u32 as Step>::forward_unchecked(_8, const 1_usize) -> [return: bb4, unwind: bb11];
} }
bb4: { bb4: {
((*_6).0: u32) = move _14; _4 = move _9;
StorageDead(_14); StorageDead(_9);
_12 = Option::<u32>::Some(_13); _7 = Option::<u32>::Some(_8);
goto -> bb5; goto -> bb5;
} }
bb5: { bb5: {
StorageDead(_11); StorageDead(_6);
StorageDead(_13); StorageDead(_8);
_15 = discriminant(_12); _10 = discriminant(_7);
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _10) -> [0: bb6, 1: bb8, otherwise: bb10];
} }
bb6: { bb6: {
StorageDead(_12); StorageDead(_7);
StorageDead(_5); StorageDead(_4);
drop(_3) -> [return: bb7, unwind continue]; drop(_3) -> [return: bb7, unwind continue];
} }
@ -110,18 +94,18 @@ fn forward_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
} }
bb8: { bb8: {
_16 = ((_12 as Some).0: u32); _11 = ((_7 as Some).0: u32);
StorageLive(_17); StorageLive(_12);
_17 = &_3; _12 = &_3;
StorageLive(_18); StorageLive(_13);
_18 = (_16,); _13 = (_11,);
_19 = <impl Fn(u32) as Fn<(u32,)>>::call(move _17, move _18) -> [return: bb9, unwind: bb11]; _14 = <impl Fn(u32) as Fn<(u32,)>>::call(move _12, move _13) -> [return: bb9, unwind: bb11];
} }
bb9: { bb9: {
StorageDead(_18); StorageDead(_13);
StorageDead(_17);
StorageDead(_12); StorageDead(_12);
StorageDead(_7);
goto -> bb1; goto -> bb1;
} }

View file

@ -40,11 +40,13 @@ fn inclusive_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
bb1: { bb1: {
StorageLive(_7); StorageLive(_7);
StorageLive(_6);
_6 = &mut _5; _6 = &mut _5;
_7 = <RangeInclusive<u32> as iter::range::RangeInclusiveIteratorImpl>::spec_next(_6) -> [return: bb2, unwind unreachable]; _7 = <RangeInclusive<u32> as iter::range::RangeInclusiveIteratorImpl>::spec_next(_6) -> [return: bb2, unwind unreachable];
} }
bb2: { bb2: {
StorageDead(_6);
_8 = discriminant(_7); _8 = discriminant(_7);
switchInt(move _8) -> [0: bb3, 1: bb5, otherwise: bb7]; switchInt(move _8) -> [0: bb3, 1: bb5, otherwise: bb7];
} }

View file

@ -40,11 +40,13 @@ fn inclusive_loop(_1: u32, _2: u32, _3: impl Fn(u32)) -> () {
bb1: { bb1: {
StorageLive(_7); StorageLive(_7);
StorageLive(_6);
_6 = &mut _5; _6 = &mut _5;
_7 = <RangeInclusive<u32> as iter::range::RangeInclusiveIteratorImpl>::spec_next(_6) -> [return: bb2, unwind: bb8]; _7 = <RangeInclusive<u32> as iter::range::RangeInclusiveIteratorImpl>::spec_next(_6) -> [return: bb2, unwind: bb8];
} }
bb2: { bb2: {
StorageDead(_6);
_8 = discriminant(_7); _8 = discriminant(_7);
switchInt(move _8) -> [0: bb3, 1: bb5, otherwise: bb7]; switchInt(move _8) -> [0: bb3, 1: bb5, otherwise: bb7];
} }

View file

@ -7,42 +7,34 @@ fn range_iter_next(_1: &mut std::ops::Range<u32>) -> Option<u32> {
debug self => _1; debug self => _1;
scope 2 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) { scope 2 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _1; debug self => _1;
let mut _2: &u32; let mut _4: bool;
let mut _3: &u32; let _5: u32;
let mut _6: bool; let mut _6: u32;
let _7: u32;
let mut _8: u32;
scope 3 { scope 3 {
debug old => _7; debug old => _5;
scope 4 { scope 4 {
} }
} }
scope 5 (inlined cmp::impls::<impl PartialOrd for u32>::lt) { scope 5 (inlined cmp::impls::<impl PartialOrd for u32>::lt) {
debug self => _2; debug self => &((*_1).0: u32);
debug other => _3; debug other => &((*_1).1: u32);
let mut _4: u32; let mut _2: u32;
let mut _5: u32; let mut _3: u32;
} }
} }
} }
bb0: { bb0: {
StorageLive(_7);
StorageLive(_6);
StorageLive(_2);
_2 = &((*_1).0: u32);
StorageLive(_3);
_3 = &((*_1).1: u32);
StorageLive(_4);
_4 = (*_2);
StorageLive(_5); StorageLive(_5);
_5 = (*_3); StorageLive(_4);
_6 = Lt(move _4, move _5); StorageLive(_2);
StorageDead(_5); _2 = ((*_1).0: u32);
StorageDead(_4); StorageLive(_3);
_3 = ((*_1).1: u32);
_4 = Lt(move _2, move _3);
StorageDead(_3); StorageDead(_3);
StorageDead(_2); StorageDead(_2);
switchInt(move _6) -> [0: bb1, otherwise: bb2]; switchInt(move _4) -> [0: bb1, otherwise: bb2];
} }
bb1: { bb1: {
@ -51,21 +43,21 @@ fn range_iter_next(_1: &mut std::ops::Range<u32>) -> Option<u32> {
} }
bb2: { bb2: {
_7 = ((*_1).0: u32); _5 = ((*_1).0: u32);
StorageLive(_8); StorageLive(_6);
_8 = <u32 as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb3, unwind unreachable]; _6 = <u32 as Step>::forward_unchecked(_5, const 1_usize) -> [return: bb3, unwind unreachable];
} }
bb3: { bb3: {
((*_1).0: u32) = move _8; ((*_1).0: u32) = move _6;
StorageDead(_8); StorageDead(_6);
_0 = Option::<u32>::Some(_7); _0 = Option::<u32>::Some(_5);
goto -> bb4; goto -> bb4;
} }
bb4: { bb4: {
StorageDead(_6); StorageDead(_4);
StorageDead(_7); StorageDead(_5);
return; return;
} }
} }

View file

@ -7,42 +7,34 @@ fn range_iter_next(_1: &mut std::ops::Range<u32>) -> Option<u32> {
debug self => _1; debug self => _1;
scope 2 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) { scope 2 (inlined <std::ops::Range<u32> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _1; debug self => _1;
let mut _2: &u32; let mut _4: bool;
let mut _3: &u32; let _5: u32;
let mut _6: bool; let mut _6: u32;
let _7: u32;
let mut _8: u32;
scope 3 { scope 3 {
debug old => _7; debug old => _5;
scope 4 { scope 4 {
} }
} }
scope 5 (inlined cmp::impls::<impl PartialOrd for u32>::lt) { scope 5 (inlined cmp::impls::<impl PartialOrd for u32>::lt) {
debug self => _2; debug self => &((*_1).0: u32);
debug other => _3; debug other => &((*_1).1: u32);
let mut _4: u32; let mut _2: u32;
let mut _5: u32; let mut _3: u32;
} }
} }
} }
bb0: { bb0: {
StorageLive(_7);
StorageLive(_6);
StorageLive(_2);
_2 = &((*_1).0: u32);
StorageLive(_3);
_3 = &((*_1).1: u32);
StorageLive(_4);
_4 = (*_2);
StorageLive(_5); StorageLive(_5);
_5 = (*_3); StorageLive(_4);
_6 = Lt(move _4, move _5); StorageLive(_2);
StorageDead(_5); _2 = ((*_1).0: u32);
StorageDead(_4); StorageLive(_3);
_3 = ((*_1).1: u32);
_4 = Lt(move _2, move _3);
StorageDead(_3); StorageDead(_3);
StorageDead(_2); StorageDead(_2);
switchInt(move _6) -> [0: bb1, otherwise: bb2]; switchInt(move _4) -> [0: bb1, otherwise: bb2];
} }
bb1: { bb1: {
@ -51,21 +43,21 @@ fn range_iter_next(_1: &mut std::ops::Range<u32>) -> Option<u32> {
} }
bb2: { bb2: {
_7 = ((*_1).0: u32); _5 = ((*_1).0: u32);
StorageLive(_8); StorageLive(_6);
_8 = <u32 as Step>::forward_unchecked(_7, const 1_usize) -> [return: bb3, unwind continue]; _6 = <u32 as Step>::forward_unchecked(_5, const 1_usize) -> [return: bb3, unwind continue];
} }
bb3: { bb3: {
((*_1).0: u32) = move _8; ((*_1).0: u32) = move _6;
StorageDead(_8); StorageDead(_6);
_0 = Option::<u32>::Some(_7); _0 = Option::<u32>::Some(_5);
goto -> bb4; goto -> bb4;
} }
bb4: { bb4: {
StorageDead(_6); StorageDead(_4);
StorageDead(_7); StorageDead(_5);
return; return;
} }
} }

View file

@ -3,214 +3,138 @@
fn variant_a::{closure#0}(_1: &mut [closure@$DIR/slice_filter.rs:7:25: 7:39], _2: &&(usize, usize, usize, usize)) -> bool { fn variant_a::{closure#0}(_1: &mut [closure@$DIR/slice_filter.rs:7:25: 7:39], _2: &&(usize, usize, usize, usize)) -> bool {
let mut _0: bool; let mut _0: bool;
let mut _3: &(usize, usize, usize, usize); let mut _3: &(usize, usize, usize, usize);
let _4: &usize; let mut _4: &(usize, usize, usize, usize);
let mut _5: &(usize, usize, usize, usize); let mut _5: &(usize, usize, usize, usize);
let _6: &usize; let mut _6: &(usize, usize, usize, usize);
let mut _7: &(usize, usize, usize, usize); let mut _9: bool;
let _8: &usize; let mut _10: bool;
let mut _9: &(usize, usize, usize, usize); let mut _13: bool;
let _10: &usize; let mut _16: bool;
let mut _11: &&usize; let mut _17: bool;
let _12: &usize; let mut _20: bool;
let mut _13: &&usize;
let mut _18: bool;
let mut _19: bool;
let mut _20: &&usize;
let _21: &usize;
let mut _22: &&usize;
let mut _27: bool;
let mut _28: &&usize;
let _29: &usize;
let mut _30: &&usize;
let mut _35: bool;
let mut _36: bool;
let mut _37: &&usize;
let _38: &usize;
let mut _39: &&usize;
let mut _44: bool;
scope 1 { scope 1 {
debug a => _4; debug a => &((*_3).0: usize);
debug b => _6; debug b => &((*_4).1: usize);
debug c => _8; debug c => &((*_5).2: usize);
debug d => _10; debug d => &((*_6).3: usize);
scope 2 (inlined cmp::impls::<impl PartialOrd for &usize>::le) { scope 2 (inlined cmp::impls::<impl PartialOrd for &usize>::le) {
debug self => _11; debug self => &&((*_3).0: usize);
debug other => _13; debug other => &&((*_5).2: usize);
let mut _14: &usize;
let mut _15: &usize;
scope 3 (inlined cmp::impls::<impl PartialOrd for usize>::le) { scope 3 (inlined cmp::impls::<impl PartialOrd for usize>::le) {
debug self => _14; debug self => &((*_3).0: usize);
debug other => _15; debug other => &((*_5).2: usize);
let mut _16: usize; let mut _7: usize;
let mut _17: usize; let mut _8: usize;
} }
} }
scope 4 (inlined cmp::impls::<impl PartialOrd for &usize>::le) { scope 4 (inlined cmp::impls::<impl PartialOrd for &usize>::le) {
debug self => _28; debug self => &&((*_5).2: usize);
debug other => _30; debug other => &&((*_3).0: usize);
let mut _31: &usize;
let mut _32: &usize;
scope 5 (inlined cmp::impls::<impl PartialOrd for usize>::le) { scope 5 (inlined cmp::impls::<impl PartialOrd for usize>::le) {
debug self => _31; debug self => &((*_5).2: usize);
debug other => _32; debug other => &((*_3).0: usize);
let mut _33: usize; let mut _14: usize;
let mut _34: usize; let mut _15: usize;
} }
} }
scope 6 (inlined cmp::impls::<impl PartialOrd for &usize>::le) { scope 6 (inlined cmp::impls::<impl PartialOrd for &usize>::le) {
debug self => _20; debug self => &&((*_6).3: usize);
debug other => _22; debug other => &&((*_4).1: usize);
let mut _23: &usize;
let mut _24: &usize;
scope 7 (inlined cmp::impls::<impl PartialOrd for usize>::le) { scope 7 (inlined cmp::impls::<impl PartialOrd for usize>::le) {
debug self => _23; debug self => &((*_6).3: usize);
debug other => _24; debug other => &((*_4).1: usize);
let mut _25: usize; let mut _11: usize;
let mut _26: usize; let mut _12: usize;
} }
} }
scope 8 (inlined cmp::impls::<impl PartialOrd for &usize>::le) { scope 8 (inlined cmp::impls::<impl PartialOrd for &usize>::le) {
debug self => _37; debug self => &&((*_4).1: usize);
debug other => _39; debug other => &&((*_6).3: usize);
let mut _40: &usize;
let mut _41: &usize;
scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::le) { scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::le) {
debug self => _40; debug self => &((*_4).1: usize);
debug other => _41; debug other => &((*_6).3: usize);
let mut _42: usize; let mut _18: usize;
let mut _43: usize; let mut _19: usize;
} }
} }
} }
bb0: { bb0: {
StorageLive(_4);
_3 = deref_copy (*_2); _3 = deref_copy (*_2);
_4 = &((*_3).0: usize); _4 = deref_copy (*_2);
StorageLive(_6);
_5 = deref_copy (*_2); _5 = deref_copy (*_2);
_6 = &((*_5).1: usize); _6 = deref_copy (*_2);
StorageLive(_8);
_7 = deref_copy (*_2);
_8 = &((*_7).2: usize);
StorageLive(_10); StorageLive(_10);
_9 = deref_copy (*_2); StorageLive(_9);
_10 = &((*_9).3: usize); StorageLive(_7);
StorageLive(_19); _7 = ((*_3).0: usize);
StorageLive(_18); StorageLive(_8);
StorageLive(_11); _8 = ((*_5).2: usize);
_11 = &_4; _9 = Le(move _7, move _8);
StorageLive(_13); StorageDead(_8);
StorageLive(_12); StorageDead(_7);
_12 = _8; switchInt(move _9) -> [0: bb1, otherwise: bb2];
_13 = &_12;
_14 = deref_copy (*_11);
_15 = deref_copy (*_13);
StorageLive(_16);
_16 = (*_14);
StorageLive(_17);
_17 = (*_15);
_18 = Le(move _16, move _17);
StorageDead(_17);
StorageDead(_16);
StorageDead(_12);
StorageDead(_13);
StorageDead(_11);
switchInt(move _18) -> [0: bb1, otherwise: bb2];
} }
bb1: { bb1: {
_19 = const false; _10 = const false;
goto -> bb3; goto -> bb3;
} }
bb2: { bb2: {
StorageLive(_27); StorageLive(_13);
StorageLive(_20); StorageLive(_11);
_20 = &_10; _11 = ((*_6).3: usize);
StorageLive(_22); StorageLive(_12);
StorageLive(_21); _12 = ((*_4).1: usize);
_21 = _6; _13 = Le(move _11, move _12);
_22 = &_21; StorageDead(_12);
_23 = deref_copy (*_20); StorageDead(_11);
_24 = deref_copy (*_22); _10 = move _13;
StorageLive(_25);
_25 = (*_23);
StorageLive(_26);
_26 = (*_24);
_27 = Le(move _25, move _26);
StorageDead(_26);
StorageDead(_25);
StorageDead(_21);
StorageDead(_22);
StorageDead(_20);
_19 = move _27;
goto -> bb3; goto -> bb3;
} }
bb3: { bb3: {
StorageDead(_27); StorageDead(_13);
StorageDead(_18); StorageDead(_9);
switchInt(move _19) -> [0: bb4, otherwise: bb8]; switchInt(move _10) -> [0: bb4, otherwise: bb8];
} }
bb4: { bb4: {
StorageLive(_36); StorageLive(_17);
StorageLive(_35); StorageLive(_16);
StorageLive(_28); StorageLive(_14);
_28 = &_8; _14 = ((*_5).2: usize);
StorageLive(_30); StorageLive(_15);
StorageLive(_29); _15 = ((*_3).0: usize);
_29 = _4; _16 = Le(move _14, move _15);
_30 = &_29; StorageDead(_15);
_31 = deref_copy (*_28); StorageDead(_14);
_32 = deref_copy (*_30); switchInt(move _16) -> [0: bb5, otherwise: bb6];
StorageLive(_33);
_33 = (*_31);
StorageLive(_34);
_34 = (*_32);
_35 = Le(move _33, move _34);
StorageDead(_34);
StorageDead(_33);
StorageDead(_29);
StorageDead(_30);
StorageDead(_28);
switchInt(move _35) -> [0: bb5, otherwise: bb6];
} }
bb5: { bb5: {
_36 = const false; _17 = const false;
goto -> bb7; goto -> bb7;
} }
bb6: { bb6: {
StorageLive(_44); StorageLive(_20);
StorageLive(_37); StorageLive(_18);
_37 = &_6; _18 = ((*_4).1: usize);
StorageLive(_39); StorageLive(_19);
StorageLive(_38); _19 = ((*_6).3: usize);
_38 = _10; _20 = Le(move _18, move _19);
_39 = &_38; StorageDead(_19);
_40 = deref_copy (*_37); StorageDead(_18);
_41 = deref_copy (*_39); _17 = move _20;
StorageLive(_42);
_42 = (*_40);
StorageLive(_43);
_43 = (*_41);
_44 = Le(move _42, move _43);
StorageDead(_43);
StorageDead(_42);
StorageDead(_38);
StorageDead(_39);
StorageDead(_37);
_36 = move _44;
goto -> bb7; goto -> bb7;
} }
bb7: { bb7: {
StorageDead(_44); StorageDead(_20);
StorageDead(_35); StorageDead(_16);
_0 = move _36; _0 = move _17;
goto -> bb9; goto -> bb9;
} }
@ -220,12 +144,8 @@ fn variant_a::{closure#0}(_1: &mut [closure@$DIR/slice_filter.rs:7:25: 7:39], _2
} }
bb9: { bb9: {
StorageDead(_36); StorageDead(_17);
StorageDead(_19);
StorageDead(_10); StorageDead(_10);
StorageDead(_8);
StorageDead(_6);
StorageDead(_4);
return; return;
} }
} }

View file

@ -10,38 +10,37 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
scope 2 (inlined <usize as SliceIndex<[u32]>>::get_mut) { scope 2 (inlined <usize as SliceIndex<[u32]>>::get_mut) {
debug self => _2; debug self => _2;
debug slice => _1; debug slice => _1;
let mut _3: &[u32]; let mut _3: usize;
let mut _4: usize; let mut _4: bool;
let mut _5: bool; let mut _5: *mut [u32];
let mut _6: *mut [u32]; let mut _7: *mut u32;
let mut _8: *mut u32; let mut _8: &mut u32;
let mut _9: &mut u32;
scope 3 { scope 3 {
scope 4 (inlined <usize as SliceIndex<[u32]>>::get_unchecked_mut) { scope 4 (inlined <usize as SliceIndex<[u32]>>::get_unchecked_mut) {
debug self => _2; debug self => _2;
debug slice => _6; debug slice => _5;
let mut _7: *mut u32; let mut _6: *mut u32;
scope 5 { scope 5 {
debug this => _2; debug this => _2;
scope 6 { scope 6 {
scope 7 (inlined <usize as SliceIndex<[T]>>::get_unchecked_mut::runtime::<u32>) { scope 7 (inlined <usize as SliceIndex<[T]>>::get_unchecked_mut::runtime::<u32>) {
debug this => _2; debug this => _2;
debug slice => _6; debug slice => _5;
scope 8 (inlined ptr::mut_ptr::<impl *mut [u32]>::len) { scope 8 (inlined ptr::mut_ptr::<impl *mut [u32]>::len) {
debug self => _6; debug self => _5;
let mut _10: *const [u32]; let mut _9: *const [u32];
scope 9 (inlined std::ptr::metadata::<[u32]>) { scope 9 (inlined std::ptr::metadata::<[u32]>) {
debug ptr => _10; debug ptr => _9;
scope 10 { scope 10 {
} }
} }
} }
} }
scope 11 (inlined ptr::mut_ptr::<impl *mut [u32]>::as_mut_ptr) { scope 11 (inlined ptr::mut_ptr::<impl *mut [u32]>::as_mut_ptr) {
debug self => _6; debug self => _5;
} }
scope 12 (inlined ptr::mut_ptr::<impl *mut u32>::add) { scope 12 (inlined ptr::mut_ptr::<impl *mut u32>::add) {
debug self => _7; debug self => _6;
debug count => _2; debug count => _2;
scope 13 { scope 13 {
} }
@ -54,16 +53,13 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
} }
bb0: { bb0: {
StorageLive(_9); StorageLive(_7);
StorageLive(_5);
StorageLive(_4); StorageLive(_4);
StorageLive(_3); StorageLive(_3);
_3 = &(*_1); _3 = Len((*_1));
_4 = Len((*_3)); _4 = Lt(_2, move _3);
StorageDead(_3); StorageDead(_3);
_5 = Lt(_2, move _4); switchInt(move _4) -> [0: bb1, otherwise: bb2];
StorageDead(_4);
switchInt(move _5) -> [0: bb1, otherwise: bb2];
} }
bb1: { bb1: {
@ -73,24 +69,24 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
bb2: { bb2: {
StorageLive(_8); StorageLive(_8);
StorageLive(_5);
_5 = &raw mut (*_1);
StorageLive(_9);
StorageLive(_6); StorageLive(_6);
_6 = &raw mut (*_1); _6 = _5 as *mut u32 (PtrToPtr);
StorageLive(_10); _7 = Offset(_6, _2);
StorageLive(_7);
_7 = _6 as *mut u32 (PtrToPtr);
_8 = Offset(_7, _2);
StorageDead(_7);
StorageDead(_10);
StorageDead(_6); StorageDead(_6);
_9 = &mut (*_8); StorageDead(_9);
_0 = Option::<&mut u32>::Some(_9); StorageDead(_5);
_8 = &mut (*_7);
_0 = Option::<&mut u32>::Some(move _8);
StorageDead(_8); StorageDead(_8);
goto -> bb3; goto -> bb3;
} }
bb3: { bb3: {
StorageDead(_5); StorageDead(_4);
StorageDead(_9); StorageDead(_7);
return; return;
} }
} }

View file

@ -10,38 +10,37 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
scope 2 (inlined <usize as SliceIndex<[u32]>>::get_mut) { scope 2 (inlined <usize as SliceIndex<[u32]>>::get_mut) {
debug self => _2; debug self => _2;
debug slice => _1; debug slice => _1;
let mut _3: &[u32]; let mut _3: usize;
let mut _4: usize; let mut _4: bool;
let mut _5: bool; let mut _5: *mut [u32];
let mut _6: *mut [u32]; let mut _7: *mut u32;
let mut _8: *mut u32; let mut _8: &mut u32;
let mut _9: &mut u32;
scope 3 { scope 3 {
scope 4 (inlined <usize as SliceIndex<[u32]>>::get_unchecked_mut) { scope 4 (inlined <usize as SliceIndex<[u32]>>::get_unchecked_mut) {
debug self => _2; debug self => _2;
debug slice => _6; debug slice => _5;
let mut _7: *mut u32; let mut _6: *mut u32;
scope 5 { scope 5 {
debug this => _2; debug this => _2;
scope 6 { scope 6 {
scope 7 (inlined <usize as SliceIndex<[T]>>::get_unchecked_mut::runtime::<u32>) { scope 7 (inlined <usize as SliceIndex<[T]>>::get_unchecked_mut::runtime::<u32>) {
debug this => _2; debug this => _2;
debug slice => _6; debug slice => _5;
scope 8 (inlined ptr::mut_ptr::<impl *mut [u32]>::len) { scope 8 (inlined ptr::mut_ptr::<impl *mut [u32]>::len) {
debug self => _6; debug self => _5;
let mut _10: *const [u32]; let mut _9: *const [u32];
scope 9 (inlined std::ptr::metadata::<[u32]>) { scope 9 (inlined std::ptr::metadata::<[u32]>) {
debug ptr => _10; debug ptr => _9;
scope 10 { scope 10 {
} }
} }
} }
} }
scope 11 (inlined ptr::mut_ptr::<impl *mut [u32]>::as_mut_ptr) { scope 11 (inlined ptr::mut_ptr::<impl *mut [u32]>::as_mut_ptr) {
debug self => _6; debug self => _5;
} }
scope 12 (inlined ptr::mut_ptr::<impl *mut u32>::add) { scope 12 (inlined ptr::mut_ptr::<impl *mut u32>::add) {
debug self => _7; debug self => _6;
debug count => _2; debug count => _2;
scope 13 { scope 13 {
} }
@ -54,16 +53,13 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
} }
bb0: { bb0: {
StorageLive(_9); StorageLive(_7);
StorageLive(_5);
StorageLive(_4); StorageLive(_4);
StorageLive(_3); StorageLive(_3);
_3 = &(*_1); _3 = Len((*_1));
_4 = Len((*_3)); _4 = Lt(_2, move _3);
StorageDead(_3); StorageDead(_3);
_5 = Lt(_2, move _4); switchInt(move _4) -> [0: bb1, otherwise: bb2];
StorageDead(_4);
switchInt(move _5) -> [0: bb1, otherwise: bb2];
} }
bb1: { bb1: {
@ -73,24 +69,24 @@ fn slice_get_mut_usize(_1: &mut [u32], _2: usize) -> Option<&mut u32> {
bb2: { bb2: {
StorageLive(_8); StorageLive(_8);
StorageLive(_5);
_5 = &raw mut (*_1);
StorageLive(_9);
StorageLive(_6); StorageLive(_6);
_6 = &raw mut (*_1); _6 = _5 as *mut u32 (PtrToPtr);
StorageLive(_10); _7 = Offset(_6, _2);
StorageLive(_7);
_7 = _6 as *mut u32 (PtrToPtr);
_8 = Offset(_7, _2);
StorageDead(_7);
StorageDead(_10);
StorageDead(_6); StorageDead(_6);
_9 = &mut (*_8); StorageDead(_9);
_0 = Option::<&mut u32>::Some(_9); StorageDead(_5);
_8 = &mut (*_7);
_0 = Option::<&mut u32>::Some(move _8);
StorageDead(_8); StorageDead(_8);
goto -> bb3; goto -> bb3;
} }
bb3: { bb3: {
StorageDead(_5); StorageDead(_4);
StorageDead(_9); StorageDead(_7);
return; return;
} }
} }

View file

@ -61,7 +61,6 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
bb0: { bb0: {
_3 = move (_2.0: usize); _3 = move (_2.0: usize);
_4 = move (_2.1: usize); _4 = move (_2.1: usize);
StorageLive(_13);
StorageLive(_5); StorageLive(_5);
_5 = &raw mut (*_1); _5 = &raw mut (*_1);
StorageLive(_14); StorageLive(_14);
@ -92,7 +91,6 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
StorageDead(_15); StorageDead(_15);
StorageDead(_5); StorageDead(_5);
_0 = &mut (*_13); _0 = &mut (*_13);
StorageDead(_13);
return; return;
} }
} }

View file

@ -61,7 +61,6 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
bb0: { bb0: {
_3 = move (_2.0: usize); _3 = move (_2.0: usize);
_4 = move (_2.1: usize); _4 = move (_2.1: usize);
StorageLive(_13);
StorageLive(_5); StorageLive(_5);
_5 = &raw mut (*_1); _5 = &raw mut (*_1);
StorageLive(_14); StorageLive(_14);
@ -92,7 +91,6 @@ fn slice_get_unchecked_mut_range(_1: &mut [u32], _2: std::ops::Range<usize>) ->
StorageDead(_15); StorageDead(_15);
StorageDead(_5); StorageDead(_5);
_0 = &mut (*_13); _0 = &mut (*_13);
StorageDead(_13);
return; return;
} }
} }

View file

@ -152,11 +152,13 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
bb4: { bb4: {
StorageLive(_17); StorageLive(_17);
StorageLive(_16);
_16 = &mut _15; _16 = &mut _15;
_17 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(_16) -> [return: bb5, unwind unreachable]; _17 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _16) -> [return: bb5, unwind unreachable];
} }
bb5: { bb5: {
StorageDead(_16);
_18 = discriminant(_17); _18 = discriminant(_17);
switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10];
} }

View file

@ -152,11 +152,13 @@ fn enumerated_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
bb4: { bb4: {
StorageLive(_17); StorageLive(_17);
StorageLive(_16);
_16 = &mut _15; _16 = &mut _15;
_17 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(_16) -> [return: bb5, unwind: bb11]; _17 = <Enumerate<std::slice::Iter<'_, T>> as Iterator>::next(move _16) -> [return: bb5, unwind: bb11];
} }
bb5: { bb5: {
StorageDead(_16);
_18 = discriminant(_17); _18 = discriminant(_17);
switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10];
} }

View file

@ -140,11 +140,13 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
bb4: { bb4: {
StorageLive(_16); StorageLive(_16);
StorageLive(_15);
_15 = &mut _14; _15 = &mut _14;
_16 = <std::slice::Iter<'_, T> as Iterator>::next(_15) -> [return: bb5, unwind unreachable]; _16 = <std::slice::Iter<'_, T> as Iterator>::next(move _15) -> [return: bb5, unwind unreachable];
} }
bb5: { bb5: {
StorageDead(_15);
_17 = discriminant(_16); _17 = discriminant(_16);
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
} }

View file

@ -140,11 +140,13 @@ fn forward_loop(_1: &[T], _2: impl Fn(&T)) -> () {
bb4: { bb4: {
StorageLive(_16); StorageLive(_16);
StorageLive(_15);
_15 = &mut _14; _15 = &mut _14;
_16 = <std::slice::Iter<'_, T> as Iterator>::next(_15) -> [return: bb5, unwind: bb11]; _16 = <std::slice::Iter<'_, T> as Iterator>::next(move _15) -> [return: bb5, unwind: bb11];
} }
bb5: { bb5: {
StorageDead(_15);
_17 = discriminant(_16); _17 = discriminant(_16);
switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _17) -> [0: bb6, 1: bb8, otherwise: bb10];
} }

View file

@ -5,112 +5,95 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
debug f => _2; debug f => _2;
let mut _0: (); let mut _0: ();
let mut _3: usize; let mut _3: usize;
let mut _4: std::ops::Range<usize>; let mut _4: usize;
let mut _5: std::ops::Range<usize>; let mut _7: std::option::Option<usize>;
let mut _6: &mut std::ops::Range<usize>; let mut _10: isize;
let mut _12: std::option::Option<usize>; let mut _12: usize;
let mut _15: isize; let mut _13: bool;
let mut _17: usize; let mut _15: &impl Fn(usize, &T);
let mut _18: bool; let mut _16: (usize, &T);
let mut _20: &impl Fn(usize, &T); let _17: ();
let mut _21: (usize, &T); let mut _18: usize;
let _22: ();
scope 1 { scope 1 {
debug iter => _5; debug iter => std::ops::Range<usize>{ .0 => _4, .1 => _3, };
let _16: usize; let _11: usize;
scope 2 { scope 2 {
debug i => _16; debug i => _11;
let _19: &T; let _14: &T;
scope 3 { scope 3 {
debug x => _19; debug x => _14;
} }
} }
scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) { scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
debug self => _6; debug self => &std::ops::Range<usize>{ .0 => _4, .1 => _3, };
scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) { scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _6; debug self => &std::ops::Range<usize>{ .0 => _4, .1 => _3, };
let mut _7: &usize; let mut _6: bool;
let mut _8: &usize; let _8: usize;
let mut _11: bool; let mut _9: usize;
let _13: usize;
let mut _14: usize;
scope 7 { scope 7 {
debug old => _13; debug old => _8;
scope 8 { scope 8 {
} }
} }
scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::lt) { scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::lt) {
debug self => _7; debug self => &_4;
debug other => _8; debug other => &_3;
let mut _9: usize; let mut _5: usize;
let mut _10: usize;
} }
} }
} }
} }
scope 4 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) { scope 4 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) {
debug self => _4; debug self => std::ops::Range<usize>{ .0 => _18, .1 => _3, };
} }
bb0: { bb0: {
StorageLive(_3);
_3 = Len((*_1)); _3 = Len((*_1));
_4 = std::ops::Range::<usize> { start: const 0_usize, end: move _3 }; StorageLive(_4);
StorageDead(_3); _4 = const 0_usize;
StorageLive(_5);
_5 = move _4;
goto -> bb1; goto -> bb1;
} }
bb1: { bb1: {
StorageLive(_12);
_6 = &mut _5;
StorageLive(_13);
StorageLive(_11);
StorageLive(_7); StorageLive(_7);
_7 = &((*_6).0: usize);
StorageLive(_8); StorageLive(_8);
_8 = &((*_6).1: usize); StorageLive(_6);
StorageLive(_9); StorageLive(_5);
_9 = (*_7); _5 = _4;
StorageLive(_10); _6 = Lt(move _5, _3);
_10 = (*_8); StorageDead(_5);
_11 = Lt(move _9, move _10); switchInt(move _6) -> [0: bb2, otherwise: bb3];
StorageDead(_10);
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
switchInt(move _11) -> [0: bb2, otherwise: bb3];
} }
bb2: { bb2: {
_12 = Option::<usize>::None; _7 = Option::<usize>::None;
goto -> bb5; goto -> bb5;
} }
bb3: { bb3: {
_13 = ((*_6).0: usize); _8 = _4;
StorageLive(_14); StorageLive(_9);
_14 = <usize as Step>::forward_unchecked(_13, const 1_usize) -> [return: bb4, unwind unreachable]; _9 = <usize as Step>::forward_unchecked(_8, const 1_usize) -> [return: bb4, unwind unreachable];
} }
bb4: { bb4: {
((*_6).0: usize) = move _14; _4 = move _9;
StorageDead(_14); StorageDead(_9);
_12 = Option::<usize>::Some(_13); _7 = Option::<usize>::Some(_8);
goto -> bb5; goto -> bb5;
} }
bb5: { bb5: {
StorageDead(_11); StorageDead(_6);
StorageDead(_13); StorageDead(_8);
_15 = discriminant(_12); _10 = discriminant(_7);
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb11]; switchInt(move _10) -> [0: bb6, 1: bb8, otherwise: bb11];
} }
bb6: { bb6: {
StorageDead(_12); StorageDead(_7);
StorageDead(_5); StorageDead(_4);
drop(_2) -> [return: bb7, unwind unreachable]; drop(_2) -> [return: bb7, unwind unreachable];
} }
@ -119,25 +102,25 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
} }
bb8: { bb8: {
_16 = ((_12 as Some).0: usize); _11 = ((_7 as Some).0: usize);
_17 = Len((*_1)); _12 = Len((*_1));
_18 = Lt(_16, _17); _13 = Lt(_11, _12);
assert(move _18, "index out of bounds: the length is {} but the index is {}", move _17, _16) -> [success: bb9, unwind unreachable]; assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb9, unwind unreachable];
} }
bb9: { bb9: {
_19 = &(*_1)[_16]; _14 = &(*_1)[_11];
StorageLive(_20); StorageLive(_15);
_20 = &_2; _15 = &_2;
StorageLive(_21); StorageLive(_16);
_21 = (_16, _19); _16 = (_11, _14);
_22 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _20, move _21) -> [return: bb10, unwind unreachable]; _17 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _15, move _16) -> [return: bb10, unwind unreachable];
} }
bb10: { bb10: {
StorageDead(_21); StorageDead(_16);
StorageDead(_20); StorageDead(_15);
StorageDead(_12); StorageDead(_7);
goto -> bb1; goto -> bb1;
} }

View file

@ -5,112 +5,95 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
debug f => _2; debug f => _2;
let mut _0: (); let mut _0: ();
let mut _3: usize; let mut _3: usize;
let mut _4: std::ops::Range<usize>; let mut _4: usize;
let mut _5: std::ops::Range<usize>; let mut _7: std::option::Option<usize>;
let mut _6: &mut std::ops::Range<usize>; let mut _10: isize;
let mut _12: std::option::Option<usize>; let mut _12: usize;
let mut _15: isize; let mut _13: bool;
let mut _17: usize; let mut _15: &impl Fn(usize, &T);
let mut _18: bool; let mut _16: (usize, &T);
let mut _20: &impl Fn(usize, &T); let _17: ();
let mut _21: (usize, &T); let mut _18: usize;
let _22: ();
scope 1 { scope 1 {
debug iter => _5; debug iter => std::ops::Range<usize>{ .0 => _4, .1 => _3, };
let _16: usize; let _11: usize;
scope 2 { scope 2 {
debug i => _16; debug i => _11;
let _19: &T; let _14: &T;
scope 3 { scope 3 {
debug x => _19; debug x => _14;
} }
} }
scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) { scope 5 (inlined iter::range::<impl Iterator for std::ops::Range<usize>>::next) {
debug self => _6; debug self => &std::ops::Range<usize>{ .0 => _4, .1 => _3, };
scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) { scope 6 (inlined <std::ops::Range<usize> as iter::range::RangeIteratorImpl>::spec_next) {
debug self => _6; debug self => &std::ops::Range<usize>{ .0 => _4, .1 => _3, };
let mut _7: &usize; let mut _6: bool;
let mut _8: &usize; let _8: usize;
let mut _11: bool; let mut _9: usize;
let _13: usize;
let mut _14: usize;
scope 7 { scope 7 {
debug old => _13; debug old => _8;
scope 8 { scope 8 {
} }
} }
scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::lt) { scope 9 (inlined cmp::impls::<impl PartialOrd for usize>::lt) {
debug self => _7; debug self => &_4;
debug other => _8; debug other => &_3;
let mut _9: usize; let mut _5: usize;
let mut _10: usize;
} }
} }
} }
} }
scope 4 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) { scope 4 (inlined <std::ops::Range<usize> as IntoIterator>::into_iter) {
debug self => _4; debug self => std::ops::Range<usize>{ .0 => _18, .1 => _3, };
} }
bb0: { bb0: {
StorageLive(_3);
_3 = Len((*_1)); _3 = Len((*_1));
_4 = std::ops::Range::<usize> { start: const 0_usize, end: move _3 }; StorageLive(_4);
StorageDead(_3); _4 = const 0_usize;
StorageLive(_5);
_5 = move _4;
goto -> bb1; goto -> bb1;
} }
bb1: { bb1: {
StorageLive(_12);
_6 = &mut _5;
StorageLive(_13);
StorageLive(_11);
StorageLive(_7); StorageLive(_7);
_7 = &((*_6).0: usize);
StorageLive(_8); StorageLive(_8);
_8 = &((*_6).1: usize); StorageLive(_6);
StorageLive(_9); StorageLive(_5);
_9 = (*_7); _5 = _4;
StorageLive(_10); _6 = Lt(move _5, _3);
_10 = (*_8); StorageDead(_5);
_11 = Lt(move _9, move _10); switchInt(move _6) -> [0: bb2, otherwise: bb3];
StorageDead(_10);
StorageDead(_9);
StorageDead(_8);
StorageDead(_7);
switchInt(move _11) -> [0: bb2, otherwise: bb3];
} }
bb2: { bb2: {
_12 = Option::<usize>::None; _7 = Option::<usize>::None;
goto -> bb5; goto -> bb5;
} }
bb3: { bb3: {
_13 = ((*_6).0: usize); _8 = _4;
StorageLive(_14); StorageLive(_9);
_14 = <usize as Step>::forward_unchecked(_13, const 1_usize) -> [return: bb4, unwind: bb12]; _9 = <usize as Step>::forward_unchecked(_8, const 1_usize) -> [return: bb4, unwind: bb12];
} }
bb4: { bb4: {
((*_6).0: usize) = move _14; _4 = move _9;
StorageDead(_14); StorageDead(_9);
_12 = Option::<usize>::Some(_13); _7 = Option::<usize>::Some(_8);
goto -> bb5; goto -> bb5;
} }
bb5: { bb5: {
StorageDead(_11); StorageDead(_6);
StorageDead(_13); StorageDead(_8);
_15 = discriminant(_12); _10 = discriminant(_7);
switchInt(move _15) -> [0: bb6, 1: bb8, otherwise: bb11]; switchInt(move _10) -> [0: bb6, 1: bb8, otherwise: bb11];
} }
bb6: { bb6: {
StorageDead(_12); StorageDead(_7);
StorageDead(_5); StorageDead(_4);
drop(_2) -> [return: bb7, unwind continue]; drop(_2) -> [return: bb7, unwind continue];
} }
@ -119,25 +102,25 @@ fn range_loop(_1: &[T], _2: impl Fn(usize, &T)) -> () {
} }
bb8: { bb8: {
_16 = ((_12 as Some).0: usize); _11 = ((_7 as Some).0: usize);
_17 = Len((*_1)); _12 = Len((*_1));
_18 = Lt(_16, _17); _13 = Lt(_11, _12);
assert(move _18, "index out of bounds: the length is {} but the index is {}", move _17, _16) -> [success: bb9, unwind: bb12]; assert(move _13, "index out of bounds: the length is {} but the index is {}", move _12, _11) -> [success: bb9, unwind: bb12];
} }
bb9: { bb9: {
_19 = &(*_1)[_16]; _14 = &(*_1)[_11];
StorageLive(_20); StorageLive(_15);
_20 = &_2; _15 = &_2;
StorageLive(_21); StorageLive(_16);
_21 = (_16, _19); _16 = (_11, _14);
_22 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _20, move _21) -> [return: bb10, unwind: bb12]; _17 = <impl Fn(usize, &T) as Fn<(usize, &T)>>::call(move _15, move _16) -> [return: bb10, unwind: bb12];
} }
bb10: { bb10: {
StorageDead(_21); StorageDead(_16);
StorageDead(_20); StorageDead(_15);
StorageDead(_12); StorageDead(_7);
goto -> bb1; goto -> bb1;
} }

View file

@ -7,21 +7,20 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let mut _13: std::slice::Iter<'_, T>; let mut _13: std::slice::Iter<'_, T>;
let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>; let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>;
let mut _15: std::iter::Rev<std::slice::Iter<'_, T>>; let mut _15: std::iter::Rev<std::slice::Iter<'_, T>>;
let mut _16: &mut std::iter::Rev<std::slice::Iter<'_, T>>; let mut _17: std::option::Option<&T>;
let mut _18: std::option::Option<&T>; let mut _18: isize;
let mut _19: isize; let mut _20: &impl Fn(&T);
let mut _21: &impl Fn(&T); let mut _21: (&T,);
let mut _22: (&T,); let _22: ();
let _23: ();
scope 1 { scope 1 {
debug iter => _15; debug iter => _15;
let _20: &T; let _19: &T;
scope 2 { scope 2 {
debug x => _20; debug x => _19;
} }
scope 25 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) { scope 25 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
debug self => _16; debug self => &_15;
let mut _17: &mut std::slice::Iter<'_, T>; let mut _16: &mut std::slice::Iter<'_, T>;
} }
} }
scope 3 (inlined core::slice::<impl [T]>::iter) { scope 3 (inlined core::slice::<impl [T]>::iter) {
@ -49,15 +48,15 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
debug ptr => _9; debug ptr => _9;
scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null) { scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null) {
debug self => _9; debug self => _9;
let mut _24: *mut u8; let mut _23: *mut u8;
scope 17 { scope 17 {
scope 18 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) { scope 18 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) {
debug ptr => _24; debug ptr => _23;
scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::addr) { scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::addr) {
debug self => _24; debug self => _23;
scope 20 { scope 20 {
scope 21 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) { scope 21 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) {
debug self => _24; debug self => _23;
} }
} }
} }
@ -132,10 +131,10 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
StorageLive(_9); StorageLive(_9);
_9 = _4 as *mut T (PtrToPtr); _9 = _4 as *mut T (PtrToPtr);
StorageLive(_10); StorageLive(_10);
StorageLive(_24); StorageLive(_23);
_10 = _9 as *const T (PointerCoercion(MutToConstPointer)); _10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 }; _11 = NonNull::<T> { pointer: _10 };
StorageDead(_24); StorageDead(_23);
StorageDead(_10); StorageDead(_10);
StorageDead(_9); StorageDead(_9);
StorageLive(_12); StorageLive(_12);
@ -153,21 +152,20 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
} }
bb4: { bb4: {
StorageLive(_18);
_16 = &mut _15;
StorageLive(_17); StorageLive(_17);
_17 = &mut ((*_16).0: std::slice::Iter<'_, T>); StorageLive(_16);
_18 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _17) -> [return: bb5, unwind unreachable]; _16 = &mut (_15.0: std::slice::Iter<'_, T>);
_17 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _16) -> [return: bb5, unwind unreachable];
} }
bb5: { bb5: {
StorageDead(_17); StorageDead(_16);
_19 = discriminant(_18); _18 = discriminant(_17);
switchInt(move _19) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10];
} }
bb6: { bb6: {
StorageDead(_18); StorageDead(_17);
StorageDead(_15); StorageDead(_15);
drop(_2) -> [return: bb7, unwind unreachable]; drop(_2) -> [return: bb7, unwind unreachable];
} }
@ -177,18 +175,18 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
} }
bb8: { bb8: {
_20 = ((_18 as Some).0: &T); _19 = ((_17 as Some).0: &T);
StorageLive(_20);
_20 = &_2;
StorageLive(_21); StorageLive(_21);
_21 = &_2; _21 = (_19,);
StorageLive(_22); _22 = <impl Fn(&T) as Fn<(&T,)>>::call(move _20, move _21) -> [return: bb9, unwind unreachable];
_22 = (_20,);
_23 = <impl Fn(&T) as Fn<(&T,)>>::call(move _21, move _22) -> [return: bb9, unwind unreachable];
} }
bb9: { bb9: {
StorageDead(_22);
StorageDead(_21); StorageDead(_21);
StorageDead(_18); StorageDead(_20);
StorageDead(_17);
goto -> bb4; goto -> bb4;
} }

View file

@ -7,21 +7,20 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
let mut _13: std::slice::Iter<'_, T>; let mut _13: std::slice::Iter<'_, T>;
let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>; let mut _14: std::iter::Rev<std::slice::Iter<'_, T>>;
let mut _15: std::iter::Rev<std::slice::Iter<'_, T>>; let mut _15: std::iter::Rev<std::slice::Iter<'_, T>>;
let mut _16: &mut std::iter::Rev<std::slice::Iter<'_, T>>; let mut _17: std::option::Option<&T>;
let mut _18: std::option::Option<&T>; let mut _18: isize;
let mut _19: isize; let mut _20: &impl Fn(&T);
let mut _21: &impl Fn(&T); let mut _21: (&T,);
let mut _22: (&T,); let _22: ();
let _23: ();
scope 1 { scope 1 {
debug iter => _15; debug iter => _15;
let _20: &T; let _19: &T;
scope 2 { scope 2 {
debug x => _20; debug x => _19;
} }
scope 25 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) { scope 25 (inlined <Rev<std::slice::Iter<'_, T>> as Iterator>::next) {
debug self => _16; debug self => &_15;
let mut _17: &mut std::slice::Iter<'_, T>; let mut _16: &mut std::slice::Iter<'_, T>;
} }
} }
scope 3 (inlined core::slice::<impl [T]>::iter) { scope 3 (inlined core::slice::<impl [T]>::iter) {
@ -49,15 +48,15 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
debug ptr => _9; debug ptr => _9;
scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null) { scope 16 (inlined ptr::mut_ptr::<impl *mut T>::is_null) {
debug self => _9; debug self => _9;
let mut _24: *mut u8; let mut _23: *mut u8;
scope 17 { scope 17 {
scope 18 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) { scope 18 (inlined ptr::mut_ptr::<impl *mut T>::is_null::runtime_impl) {
debug ptr => _24; debug ptr => _23;
scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::addr) { scope 19 (inlined ptr::mut_ptr::<impl *mut u8>::addr) {
debug self => _24; debug self => _23;
scope 20 { scope 20 {
scope 21 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) { scope 21 (inlined ptr::mut_ptr::<impl *mut u8>::cast::<()>) {
debug self => _24; debug self => _23;
} }
} }
} }
@ -132,10 +131,10 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
StorageLive(_9); StorageLive(_9);
_9 = _4 as *mut T (PtrToPtr); _9 = _4 as *mut T (PtrToPtr);
StorageLive(_10); StorageLive(_10);
StorageLive(_24); StorageLive(_23);
_10 = _9 as *const T (PointerCoercion(MutToConstPointer)); _10 = _9 as *const T (PointerCoercion(MutToConstPointer));
_11 = NonNull::<T> { pointer: _10 }; _11 = NonNull::<T> { pointer: _10 };
StorageDead(_24); StorageDead(_23);
StorageDead(_10); StorageDead(_10);
StorageDead(_9); StorageDead(_9);
StorageLive(_12); StorageLive(_12);
@ -153,21 +152,20 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
} }
bb4: { bb4: {
StorageLive(_18);
_16 = &mut _15;
StorageLive(_17); StorageLive(_17);
_17 = &mut ((*_16).0: std::slice::Iter<'_, T>); StorageLive(_16);
_18 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _17) -> [return: bb5, unwind: bb11]; _16 = &mut (_15.0: std::slice::Iter<'_, T>);
_17 = <std::slice::Iter<'_, T> as DoubleEndedIterator>::next_back(move _16) -> [return: bb5, unwind: bb11];
} }
bb5: { bb5: {
StorageDead(_17); StorageDead(_16);
_19 = discriminant(_18); _18 = discriminant(_17);
switchInt(move _19) -> [0: bb6, 1: bb8, otherwise: bb10]; switchInt(move _18) -> [0: bb6, 1: bb8, otherwise: bb10];
} }
bb6: { bb6: {
StorageDead(_18); StorageDead(_17);
StorageDead(_15); StorageDead(_15);
drop(_2) -> [return: bb7, unwind continue]; drop(_2) -> [return: bb7, unwind continue];
} }
@ -177,18 +175,18 @@ fn reverse_loop(_1: &[T], _2: impl Fn(&T)) -> () {
} }
bb8: { bb8: {
_20 = ((_18 as Some).0: &T); _19 = ((_17 as Some).0: &T);
StorageLive(_20);
_20 = &_2;
StorageLive(_21); StorageLive(_21);
_21 = &_2; _21 = (_19,);
StorageLive(_22); _22 = <impl Fn(&T) as Fn<(&T,)>>::call(move _20, move _21) -> [return: bb9, unwind: bb11];
_22 = (_20,);
_23 = <impl Fn(&T) as Fn<(&T,)>>::call(move _21, move _22) -> [return: bb9, unwind: bb11];
} }
bb9: { bb9: {
StorageDead(_22);
StorageDead(_21); StorageDead(_21);
StorageDead(_18); StorageDead(_20);
StorageDead(_17);
goto -> bb4; goto -> bb4;
} }

View file

@ -3,17 +3,19 @@
fn outer(_1: u8) -> u8 { fn outer(_1: u8) -> u8 {
debug v => _1; // in scope 0 at $DIR/spans.rs:10:14: 10:15 debug v => _1; // in scope 0 at $DIR/spans.rs:10:14: 10:15
let mut _0: u8; // return place in scope 0 at $DIR/spans.rs:10:24: 10:26 let mut _0: u8; // return place in scope 0 at $DIR/spans.rs:10:24: 10:26
let _2: &u8; // in scope 0 at $DIR/spans.rs:11:11: 11:13 let mut _2: &u8; // in scope 0 at $DIR/spans.rs:11:11: 11:13
bb0: { bb0: {
StorageLive(_2); // scope 0 at $DIR/spans.rs:11:11: 11:13
_2 = &_1; // scope 0 at $DIR/spans.rs:11:11: 11:13 _2 = &_1; // scope 0 at $DIR/spans.rs:11:11: 11:13
_0 = inner(_2) -> [return: bb1, unwind unreachable]; // scope 0 at $DIR/spans.rs:11:5: 11:14 _0 = inner(move _2) -> [return: bb1, unwind unreachable]; // scope 0 at $DIR/spans.rs:11:5: 11:14
// mir::Constant // mir::Constant
// + span: $DIR/spans.rs:11:5: 11:10 // + span: $DIR/spans.rs:11:5: 11:10
// + literal: Const { ty: for<'a> fn(&'a u8) -> u8 {inner}, val: Value(<ZST>) } // + literal: Const { ty: for<'a> fn(&'a u8) -> u8 {inner}, val: Value(<ZST>) }
} }
bb1: { bb1: {
StorageDead(_2); // scope 0 at $DIR/spans.rs:11:13: 11:14
return; // scope 0 at $DIR/spans.rs:12:2: 12:2 return; // scope 0 at $DIR/spans.rs:12:2: 12:2
} }
} }

View file

@ -3,17 +3,19 @@
fn outer(_1: u8) -> u8 { fn outer(_1: u8) -> u8 {
debug v => _1; // in scope 0 at $DIR/spans.rs:10:14: 10:15 debug v => _1; // in scope 0 at $DIR/spans.rs:10:14: 10:15
let mut _0: u8; // return place in scope 0 at $DIR/spans.rs:10:24: 10:26 let mut _0: u8; // return place in scope 0 at $DIR/spans.rs:10:24: 10:26
let _2: &u8; // in scope 0 at $DIR/spans.rs:11:11: 11:13 let mut _2: &u8; // in scope 0 at $DIR/spans.rs:11:11: 11:13
bb0: { bb0: {
StorageLive(_2); // scope 0 at $DIR/spans.rs:11:11: 11:13
_2 = &_1; // scope 0 at $DIR/spans.rs:11:11: 11:13 _2 = &_1; // scope 0 at $DIR/spans.rs:11:11: 11:13
_0 = inner(_2) -> [return: bb1, unwind continue]; // scope 0 at $DIR/spans.rs:11:5: 11:14 _0 = inner(move _2) -> [return: bb1, unwind continue]; // scope 0 at $DIR/spans.rs:11:5: 11:14
// mir::Constant // mir::Constant
// + span: $DIR/spans.rs:11:5: 11:10 // + span: $DIR/spans.rs:11:5: 11:10
// + literal: Const { ty: for<'a> fn(&'a u8) -> u8 {inner}, val: Value(<ZST>) } // + literal: Const { ty: for<'a> fn(&'a u8) -> u8 {inner}, val: Value(<ZST>) }
} }
bb1: { bb1: {
StorageDead(_2); // scope 0 at $DIR/spans.rs:11:13: 11:14
return; // scope 0 at $DIR/spans.rs:12:2: 12:2 return; // scope 0 at $DIR/spans.rs:12:2: 12:2
} }
} }