1
Fork 0

Simplify projections in GVN.

This commit is contained in:
Camille GILLOT 2023-09-16 09:16:04 +00:00
parent 9389373127
commit 692e528647
13 changed files with 396 additions and 127 deletions

View file

@ -66,6 +66,7 @@ use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeAndMut}; use rustc_middle::ty::{self, Ty, TyCtxt, TypeAndMut};
use rustc_span::DUMMY_SP; use rustc_span::DUMMY_SP;
use rustc_target::abi::{self, Abi, Size, VariantIdx, FIRST_VARIANT}; use rustc_target::abi::{self, Abi, Size, VariantIdx, FIRST_VARIANT};
use std::borrow::Cow;
use crate::dataflow_const_prop::DummyMachine; use crate::dataflow_const_prop::DummyMachine;
use crate::ssa::{AssignedValue, SsaLocals}; use crate::ssa::{AssignedValue, SsaLocals};
@ -461,6 +462,87 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
Some(op) Some(op)
} }
fn project(
&mut self,
place: PlaceRef<'tcx>,
value: VnIndex,
proj: PlaceElem<'tcx>,
) -> Option<VnIndex> {
let proj = match proj {
ProjectionElem::Deref => {
let ty = place.ty(self.local_decls, self.tcx).ty;
if let Some(Mutability::Not) = ty.ref_mutability()
&& let Some(pointee_ty) = ty.builtin_deref(true)
&& pointee_ty.ty.is_freeze(self.tcx, self.param_env)
{
// An immutable borrow `_x` always points to the same value for the
// lifetime of the borrow, so we can merge all instances of `*_x`.
ProjectionElem::Deref
} else {
return None;
}
}
ProjectionElem::Downcast(name, index) => ProjectionElem::Downcast(name, index),
ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty),
ProjectionElem::Index(idx) => {
let idx = self.locals[idx]?;
ProjectionElem::Index(idx)
}
ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
ProjectionElem::ConstantIndex { offset, min_length, from_end }
}
ProjectionElem::Subslice { from, to, from_end } => {
ProjectionElem::Subslice { from, to, from_end }
}
ProjectionElem::OpaqueCast(ty) => ProjectionElem::OpaqueCast(ty),
ProjectionElem::Subtype(ty) => ProjectionElem::Subtype(ty),
};
Some(self.insert(Value::Projection(value, proj)))
}
/// Simplify the projection chain if we know better.
#[instrument(level = "trace", skip(self))]
fn simplify_place_projection(&mut self, place: &mut Place<'tcx>, location: Location) {
// If the projection is indirect, we treat the local as a value, so can replace it with
// another local.
if place.is_indirect()
&& let Some(base) = self.locals[place.local]
&& let Some(new_local) = self.try_as_local(base, location)
{
place.local = new_local;
self.reused_locals.insert(new_local);
}
let mut projection = Cow::Borrowed(&place.projection[..]);
for i in 0..projection.len() {
let elem = projection[i];
if let ProjectionElem::Index(idx) = elem
&& let Some(idx) = self.locals[idx]
{
if let Some(offset) = self.evaluated[idx].as_ref()
&& let Ok(offset) = self.ecx.read_target_usize(offset)
{
projection.to_mut()[i] = ProjectionElem::ConstantIndex {
offset,
min_length: offset + 1,
from_end: false,
};
} else if let Some(new_idx) = self.try_as_local(idx, location) {
projection.to_mut()[i] = ProjectionElem::Index(new_idx);
self.reused_locals.insert(new_idx);
}
}
}
if projection.is_owned() {
place.projection = self.tcx.mk_place_elems(&projection);
}
trace!(?place);
}
/// Represent the *value* which would be read from `place`, and point `place` to a preexisting /// Represent the *value* which would be read from `place`, and point `place` to a preexisting
/// place with the same value (if that already exists). /// place with the same value (if that already exists).
#[instrument(level = "trace", skip(self), ret)] #[instrument(level = "trace", skip(self), ret)]
@ -469,6 +551,8 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
place: &mut Place<'tcx>, place: &mut Place<'tcx>,
location: Location, location: Location,
) -> Option<VnIndex> { ) -> Option<VnIndex> {
self.simplify_place_projection(place, location);
// Invariant: `place` and `place_ref` point to the same value, even if they point to // Invariant: `place` and `place_ref` point to the same value, even if they point to
// different memory locations. // different memory locations.
let mut place_ref = place.as_ref(); let mut place_ref = place.as_ref();
@ -483,53 +567,15 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
place_ref = PlaceRef { local, projection: &place.projection[index..] }; place_ref = PlaceRef { local, projection: &place.projection[index..] };
} }
let proj = match proj { let base = PlaceRef { local: place.local, projection: &place.projection[..index] };
ProjectionElem::Deref => { value = self.project(base, value, proj)?;
let ty = Place::ty_from(
place.local,
&place.projection[..index],
self.local_decls,
self.tcx,
)
.ty;
if let Some(Mutability::Not) = ty.ref_mutability()
&& let Some(pointee_ty) = ty.builtin_deref(true)
&& pointee_ty.ty.is_freeze(self.tcx, self.param_env)
{
// An immutable borrow `_x` always points to the same value for the
// lifetime of the borrow, so we can merge all instances of `*_x`.
ProjectionElem::Deref
} else {
return None;
}
}
ProjectionElem::Field(f, ty) => ProjectionElem::Field(f, ty),
ProjectionElem::Index(idx) => {
let idx = self.locals[idx]?;
ProjectionElem::Index(idx)
}
ProjectionElem::ConstantIndex { offset, min_length, from_end } => {
ProjectionElem::ConstantIndex { offset, min_length, from_end }
}
ProjectionElem::Subslice { from, to, from_end } => {
ProjectionElem::Subslice { from, to, from_end }
}
ProjectionElem::Downcast(name, index) => ProjectionElem::Downcast(name, index),
ProjectionElem::OpaqueCast(ty) => ProjectionElem::OpaqueCast(ty),
ProjectionElem::Subtype(ty) => ProjectionElem::Subtype(ty),
};
value = self.insert(Value::Projection(value, proj));
} }
if let Some(local) = self.try_as_local(value, location) if let Some(new_local) = self.try_as_local(value, location) {
&& local != place.local place_ref = PlaceRef { local: new_local, projection: &[] };
// in case we had no projection to begin with. }
{
*place = local.into(); if place_ref.local != place.local || place_ref.projection.len() < place.projection.len() {
self.reused_locals.insert(local);
} else if place_ref.local != place.local
|| place_ref.projection.len() < place.projection.len()
{
// By the invariant on `place_ref`. // By the invariant on `place_ref`.
*place = place_ref.project_deeper(&[], self.tcx); *place = place_ref.project_deeper(&[], self.tcx);
self.reused_locals.insert(place_ref.local); self.reused_locals.insert(place_ref.local);
@ -545,7 +591,10 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
location: Location, location: Location,
) -> Option<VnIndex> { ) -> Option<VnIndex> {
match *operand { match *operand {
Operand::Constant(ref constant) => Some(self.insert(Value::Constant(constant.const_))), Operand::Constant(ref mut constant) => {
let const_ = constant.const_.normalize(self.tcx, self.param_env);
Some(self.insert(Value::Constant(const_)))
}
Operand::Copy(ref mut place) | Operand::Move(ref mut place) => { Operand::Copy(ref mut place) | Operand::Move(ref mut place) => {
let value = self.simplify_place_value(place, location)?; let value = self.simplify_place_value(place, location)?;
if let Some(const_) = self.try_as_constant(value) { if let Some(const_) = self.try_as_constant(value) {
@ -595,11 +644,13 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
let ty = rvalue.ty(self.local_decls, self.tcx); let ty = rvalue.ty(self.local_decls, self.tcx);
Value::Aggregate(ty, variant_index, fields?) Value::Aggregate(ty, variant_index, fields?)
} }
Rvalue::Ref(_, borrow_kind, place) => { Rvalue::Ref(_, borrow_kind, ref mut place) => {
return self.new_pointer(place, AddressKind::Ref(borrow_kind)); self.simplify_place_projection(place, location);
return self.new_pointer(*place, AddressKind::Ref(borrow_kind));
} }
Rvalue::AddressOf(mutbl, place) => { Rvalue::AddressOf(mutbl, ref mut place) => {
return self.new_pointer(place, AddressKind::Address(mutbl)); self.simplify_place_projection(place, location);
return self.new_pointer(*place, AddressKind::Address(mutbl));
} }
// Operations. // Operations.
@ -757,6 +808,10 @@ impl<'tcx> MutVisitor<'tcx> for VnState<'_, 'tcx> {
self.tcx self.tcx
} }
fn visit_place(&mut self, place: &mut Place<'tcx>, _: PlaceContext, location: Location) {
self.simplify_place_projection(place, location);
}
fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) {
self.simplify_operand(operand, location); self.simplify_operand(operand, location);
} }

View file

@ -2,6 +2,7 @@
#![deny(rustc::untranslatable_diagnostic)] #![deny(rustc::untranslatable_diagnostic)]
#![deny(rustc::diagnostic_outside_of_impl)] #![deny(rustc::diagnostic_outside_of_impl)]
#![feature(box_patterns)] #![feature(box_patterns)]
#![feature(cow_is_borrowed)]
#![feature(decl_macro)] #![feature(decl_macro)]
#![feature(is_sorted)] #![feature(is_sorted)]
#![feature(let_chains)] #![feature(let_chains)]

View file

@ -72,7 +72,8 @@
bb2: { bb2: {
StorageDead(_7); StorageDead(_7);
StorageDead(_6); StorageDead(_6);
StorageLive(_8); - StorageLive(_8);
+ nop;
_8 = &raw const (*_1); _8 = &raw const (*_1);
StorageLive(_9); StorageLive(_9);
StorageLive(_10); StorageLive(_10);
@ -92,7 +93,8 @@
bb4: { bb4: {
StorageDead(_12); StorageDead(_12);
StorageDead(_11); StorageDead(_11);
StorageLive(_13); - StorageLive(_13);
+ nop;
_13 = &raw mut (*_1); _13 = &raw mut (*_1);
StorageLive(_14); StorageLive(_14);
StorageLive(_15); StorageLive(_15);
@ -112,7 +114,8 @@
bb6: { bb6: {
StorageDead(_17); StorageDead(_17);
StorageDead(_16); StorageDead(_16);
StorageLive(_18); - StorageLive(_18);
+ nop;
_18 = &(*_1); _18 = &(*_1);
StorageLive(_19); StorageLive(_19);
- StorageLive(_20); - StorageLive(_20);
@ -188,9 +191,12 @@
StorageDead(_32); StorageDead(_32);
StorageDead(_31); StorageDead(_31);
_0 = const (); _0 = const ();
StorageDead(_18); - StorageDead(_18);
StorageDead(_13); - StorageDead(_13);
StorageDead(_8); - StorageDead(_8);
+ nop;
+ nop;
+ nop;
return; return;
} }
} }

View file

@ -72,7 +72,8 @@
bb2: { bb2: {
StorageDead(_7); StorageDead(_7);
StorageDead(_6); StorageDead(_6);
StorageLive(_8); - StorageLive(_8);
+ nop;
_8 = &raw const (*_1); _8 = &raw const (*_1);
StorageLive(_9); StorageLive(_9);
StorageLive(_10); StorageLive(_10);
@ -92,7 +93,8 @@
bb4: { bb4: {
StorageDead(_12); StorageDead(_12);
StorageDead(_11); StorageDead(_11);
StorageLive(_13); - StorageLive(_13);
+ nop;
_13 = &raw mut (*_1); _13 = &raw mut (*_1);
StorageLive(_14); StorageLive(_14);
StorageLive(_15); StorageLive(_15);
@ -112,7 +114,8 @@
bb6: { bb6: {
StorageDead(_17); StorageDead(_17);
StorageDead(_16); StorageDead(_16);
StorageLive(_18); - StorageLive(_18);
+ nop;
_18 = &(*_1); _18 = &(*_1);
StorageLive(_19); StorageLive(_19);
- StorageLive(_20); - StorageLive(_20);
@ -188,9 +191,12 @@
StorageDead(_32); StorageDead(_32);
StorageDead(_31); StorageDead(_31);
_0 = const (); _0 = const ();
StorageDead(_18); - StorageDead(_18);
StorageDead(_13); - StorageDead(_13);
StorageDead(_8); - StorageDead(_8);
+ nop;
+ nop;
+ nop;
return; return;
} }
} }

View file

@ -20,6 +20,24 @@
let mut _15: *mut impl Sized; let mut _15: *mut impl Sized;
let _16: (); let _16: ();
let mut _17: *mut impl Sized; let mut _17: *mut impl Sized;
let _18: &mut impl Sized;
let mut _20: S<&mut impl Sized>;
let mut _21: &mut impl Sized;
let _22: ();
let mut _23: &impl Sized;
let _24: ();
let mut _25: &mut impl Sized;
let _26: ();
let mut _27: *const impl Sized;
let _28: ();
let mut _29: *mut impl Sized;
scope 1 {
debug r => _18;
let _19: &mut impl Sized;
scope 2 {
debug s => _19;
}
}
bb0: { bb0: {
StorageLive(_2); StorageLive(_2);
@ -94,11 +112,65 @@
bb8: { bb8: {
StorageDead(_17); StorageDead(_17);
StorageDead(_16); StorageDead(_16);
_0 = const (); - StorageLive(_18);
drop(_1) -> [return: bb9, unwind unreachable]; + nop;
_18 = &mut _1;
- StorageLive(_19);
+ nop;
StorageLive(_20);
StorageLive(_21);
- _21 = move _18;
- _20 = S::<&mut impl Sized>(move _21);
+ _21 = _18;
+ _20 = S::<&mut impl Sized>(_18);
StorageDead(_21);
_19 = move (_20.0: &mut impl Sized);
StorageDead(_20);
StorageLive(_22);
StorageLive(_23);
_23 = &(*_19);
_22 = opaque::<&impl Sized>(move _23) -> [return: bb9, unwind unreachable];
} }
bb9: { bb9: {
StorageDead(_23);
StorageDead(_22);
StorageLive(_24);
StorageLive(_25);
_25 = &mut (*_19);
_24 = opaque::<&mut impl Sized>(move _25) -> [return: bb10, unwind unreachable];
}
bb10: {
StorageDead(_25);
StorageDead(_24);
StorageLive(_26);
StorageLive(_27);
_27 = &raw const (*_19);
_26 = opaque::<*const impl Sized>(move _27) -> [return: bb11, unwind unreachable];
}
bb11: {
StorageDead(_27);
StorageDead(_26);
StorageLive(_28);
StorageLive(_29);
_29 = &raw mut (*_19);
_28 = opaque::<*mut impl Sized>(move _29) -> [return: bb12, unwind unreachable];
}
bb12: {
StorageDead(_29);
StorageDead(_28);
_0 = const ();
- StorageDead(_19);
- StorageDead(_18);
+ nop;
+ nop;
drop(_1) -> [return: bb13, unwind unreachable];
}
bb13: {
return; return;
} }
} }

View file

@ -20,12 +20,30 @@
let mut _15: *mut impl Sized; let mut _15: *mut impl Sized;
let _16: (); let _16: ();
let mut _17: *mut impl Sized; let mut _17: *mut impl Sized;
let _18: &mut impl Sized;
let mut _20: S<&mut impl Sized>;
let mut _21: &mut impl Sized;
let _22: ();
let mut _23: &impl Sized;
let _24: ();
let mut _25: &mut impl Sized;
let _26: ();
let mut _27: *const impl Sized;
let _28: ();
let mut _29: *mut impl Sized;
scope 1 {
debug r => _18;
let _19: &mut impl Sized;
scope 2 {
debug s => _19;
}
}
bb0: { bb0: {
StorageLive(_2); StorageLive(_2);
StorageLive(_3); StorageLive(_3);
_3 = &_1; _3 = &_1;
_2 = opaque::<&impl Sized>(move _3) -> [return: bb1, unwind: bb10]; _2 = opaque::<&impl Sized>(move _3) -> [return: bb1, unwind: bb14];
} }
bb1: { bb1: {
@ -34,7 +52,7 @@
StorageLive(_4); StorageLive(_4);
StorageLive(_5); StorageLive(_5);
_5 = &_1; _5 = &_1;
_4 = opaque::<&impl Sized>(move _5) -> [return: bb2, unwind: bb10]; _4 = opaque::<&impl Sized>(move _5) -> [return: bb2, unwind: bb14];
} }
bb2: { bb2: {
@ -43,7 +61,7 @@
StorageLive(_6); StorageLive(_6);
StorageLive(_7); StorageLive(_7);
_7 = &mut _1; _7 = &mut _1;
_6 = opaque::<&mut impl Sized>(move _7) -> [return: bb3, unwind: bb10]; _6 = opaque::<&mut impl Sized>(move _7) -> [return: bb3, unwind: bb14];
} }
bb3: { bb3: {
@ -52,7 +70,7 @@
StorageLive(_8); StorageLive(_8);
StorageLive(_9); StorageLive(_9);
_9 = &mut _1; _9 = &mut _1;
_8 = opaque::<&mut impl Sized>(move _9) -> [return: bb4, unwind: bb10]; _8 = opaque::<&mut impl Sized>(move _9) -> [return: bb4, unwind: bb14];
} }
bb4: { bb4: {
@ -61,7 +79,7 @@
StorageLive(_10); StorageLive(_10);
StorageLive(_11); StorageLive(_11);
_11 = &raw const _1; _11 = &raw const _1;
_10 = opaque::<*const impl Sized>(move _11) -> [return: bb5, unwind: bb10]; _10 = opaque::<*const impl Sized>(move _11) -> [return: bb5, unwind: bb14];
} }
bb5: { bb5: {
@ -70,7 +88,7 @@
StorageLive(_12); StorageLive(_12);
StorageLive(_13); StorageLive(_13);
_13 = &raw const _1; _13 = &raw const _1;
_12 = opaque::<*const impl Sized>(move _13) -> [return: bb6, unwind: bb10]; _12 = opaque::<*const impl Sized>(move _13) -> [return: bb6, unwind: bb14];
} }
bb6: { bb6: {
@ -79,7 +97,7 @@
StorageLive(_14); StorageLive(_14);
StorageLive(_15); StorageLive(_15);
_15 = &raw mut _1; _15 = &raw mut _1;
_14 = opaque::<*mut impl Sized>(move _15) -> [return: bb7, unwind: bb10]; _14 = opaque::<*mut impl Sized>(move _15) -> [return: bb7, unwind: bb14];
} }
bb7: { bb7: {
@ -88,25 +106,79 @@
StorageLive(_16); StorageLive(_16);
StorageLive(_17); StorageLive(_17);
_17 = &raw mut _1; _17 = &raw mut _1;
_16 = opaque::<*mut impl Sized>(move _17) -> [return: bb8, unwind: bb10]; _16 = opaque::<*mut impl Sized>(move _17) -> [return: bb8, unwind: bb14];
} }
bb8: { bb8: {
StorageDead(_17); StorageDead(_17);
StorageDead(_16); StorageDead(_16);
_0 = const (); - StorageLive(_18);
drop(_1) -> [return: bb9, unwind: bb11]; + nop;
_18 = &mut _1;
- StorageLive(_19);
+ nop;
StorageLive(_20);
StorageLive(_21);
- _21 = move _18;
- _20 = S::<&mut impl Sized>(move _21);
+ _21 = _18;
+ _20 = S::<&mut impl Sized>(_18);
StorageDead(_21);
_19 = move (_20.0: &mut impl Sized);
StorageDead(_20);
StorageLive(_22);
StorageLive(_23);
_23 = &(*_19);
_22 = opaque::<&impl Sized>(move _23) -> [return: bb9, unwind: bb14];
} }
bb9: { bb9: {
StorageDead(_23);
StorageDead(_22);
StorageLive(_24);
StorageLive(_25);
_25 = &mut (*_19);
_24 = opaque::<&mut impl Sized>(move _25) -> [return: bb10, unwind: bb14];
}
bb10: {
StorageDead(_25);
StorageDead(_24);
StorageLive(_26);
StorageLive(_27);
_27 = &raw const (*_19);
_26 = opaque::<*const impl Sized>(move _27) -> [return: bb11, unwind: bb14];
}
bb11: {
StorageDead(_27);
StorageDead(_26);
StorageLive(_28);
StorageLive(_29);
_29 = &raw mut (*_19);
_28 = opaque::<*mut impl Sized>(move _29) -> [return: bb12, unwind: bb14];
}
bb12: {
StorageDead(_29);
StorageDead(_28);
_0 = const ();
- StorageDead(_19);
- StorageDead(_18);
+ nop;
+ nop;
drop(_1) -> [return: bb13, unwind: bb15];
}
bb13: {
return; return;
} }
bb10 (cleanup): { bb14 (cleanup): {
drop(_1) -> [return: bb11, unwind terminate(cleanup)]; drop(_1) -> [return: bb15, unwind terminate(cleanup)];
} }
bb11 (cleanup): { bb15 (cleanup): {
resume; resume;
} }
} }

View file

@ -40,7 +40,8 @@
} }
bb1: { bb1: {
_6 = _3[_7]; - _6 = _3[_7];
+ _6 = _3[0 of 1];
_5 = opaque::<T>(move _6) -> [return: bb2, unwind unreachable]; _5 = opaque::<T>(move _6) -> [return: bb2, unwind unreachable];
} }
@ -61,7 +62,8 @@
} }
bb3: { bb3: {
_11 = _3[_12]; - _11 = _3[_12];
+ _11 = _3[_2];
_10 = opaque::<T>(move _11) -> [return: bb4, unwind unreachable]; _10 = opaque::<T>(move _11) -> [return: bb4, unwind unreachable];
} }

View file

@ -40,7 +40,8 @@
} }
bb1: { bb1: {
_6 = _3[_7]; - _6 = _3[_7];
+ _6 = _3[0 of 1];
_5 = opaque::<T>(move _6) -> [return: bb2, unwind continue]; _5 = opaque::<T>(move _6) -> [return: bb2, unwind continue];
} }
@ -61,7 +62,8 @@
} }
bb3: { bb3: {
_11 = _3[_12]; - _11 = _3[_12];
+ _11 = _3[_2];
_10 = opaque::<T>(move _11) -> [return: bb4, unwind continue]; _10 = opaque::<T>(move _11) -> [return: bb4, unwind continue];
} }

View file

@ -192,6 +192,13 @@ fn references(mut x: impl Sized) {
opaque(&raw const x); // should not reuse a opaque(&raw const x); // should not reuse a
opaque(&raw mut x); opaque(&raw mut x);
opaque(&raw mut x); // should not reuse a opaque(&raw mut x); // should not reuse a
let r = &mut x;
let s = S(r).0; // Obfuscate `r`.
opaque(&*s); // This is `&*r`.
opaque(&mut *s); // This is `&*r`.
opaque(&raw const *s); // This is `&*r`.
opaque(&raw mut *s); // This is `&*r`.
} }
fn dereferences(t: &mut u32, u: &impl Copy, s: &S<u32>) { fn dereferences(t: &mut u32, u: &impl Copy, s: &S<u32>) {

View file

@ -125,7 +125,8 @@
StorageLive(_12); StorageLive(_12);
StorageLive(_13); StorageLive(_13);
StorageLive(_14); StorageLive(_14);
_14 = &(*_4); - _14 = &(*_4);
+ _14 = &(*_1);
_13 = core::str::<impl str>::as_ptr(move _14) -> [return: bb4, unwind unreachable]; _13 = core::str::<impl str>::as_ptr(move _14) -> [return: bb4, unwind unreachable];
} }
@ -135,9 +136,11 @@
_8 = (move _9, move _12); _8 = (move _9, move _12);
StorageDead(_12); StorageDead(_12);
StorageDead(_9); StorageDead(_9);
StorageLive(_15); - StorageLive(_15);
+ nop;
_15 = (_8.0: &*const u8); _15 = (_8.0: &*const u8);
StorageLive(_16); - StorageLive(_16);
+ nop;
_16 = (_8.1: &*const u8); _16 = (_8.1: &*const u8);
StorageLive(_17); StorageLive(_17);
StorageLive(_18); StorageLive(_18);
@ -153,8 +156,10 @@
StorageDead(_18); StorageDead(_18);
_7 = const (); _7 = const ();
StorageDead(_17); StorageDead(_17);
StorageDead(_16); - StorageDead(_16);
StorageDead(_15); - StorageDead(_15);
+ nop;
+ nop;
StorageDead(_13); StorageDead(_13);
StorageDead(_10); StorageDead(_10);
StorageDead(_8); StorageDead(_8);
@ -184,11 +189,13 @@
- _23 = move _21; - _23 = move _21;
+ _23 = const core::panicking::AssertKind::Eq; + _23 = const core::panicking::AssertKind::Eq;
StorageLive(_24); StorageLive(_24);
StorageLive(_25); - StorageLive(_25);
+ nop;
_25 = &(*_15); _25 = &(*_15);
_24 = &(*_25); _24 = &(*_25);
StorageLive(_26); StorageLive(_26);
StorageLive(_27); - StorageLive(_27);
+ nop;
_27 = &(*_16); _27 = &(*_16);
_26 = &(*_27); _26 = &(*_27);
StorageLive(_28); StorageLive(_28);
@ -225,9 +232,11 @@
_34 = (move _35, move _38); _34 = (move _35, move _38);
StorageDead(_38); StorageDead(_38);
StorageDead(_35); StorageDead(_35);
StorageLive(_41); - StorageLive(_41);
+ nop;
_41 = (_34.0: &*const u8); _41 = (_34.0: &*const u8);
StorageLive(_42); - StorageLive(_42);
+ nop;
_42 = (_34.1: &*const u8); _42 = (_34.1: &*const u8);
StorageLive(_43); StorageLive(_43);
StorageLive(_44); StorageLive(_44);
@ -243,8 +252,10 @@
StorageDead(_44); StorageDead(_44);
_33 = const (); _33 = const ();
StorageDead(_43); StorageDead(_43);
StorageDead(_42); - StorageDead(_42);
StorageDead(_41); - StorageDead(_41);
+ nop;
+ nop;
StorageDead(_39); StorageDead(_39);
StorageDead(_36); StorageDead(_36);
StorageDead(_34); StorageDead(_34);
@ -270,11 +281,13 @@
- _49 = move _47; - _49 = move _47;
+ _49 = const core::panicking::AssertKind::Eq; + _49 = const core::panicking::AssertKind::Eq;
StorageLive(_50); StorageLive(_50);
StorageLive(_51); - StorageLive(_51);
+ nop;
_51 = &(*_41); _51 = &(*_41);
_50 = &(*_51); _50 = &(*_51);
StorageLive(_52); StorageLive(_52);
StorageLive(_53); - StorageLive(_53);
+ nop;
_53 = &(*_42); _53 = &(*_42);
_52 = &(*_53); _52 = &(*_53);
StorageLive(_54); StorageLive(_54);

View file

@ -125,7 +125,8 @@
StorageLive(_12); StorageLive(_12);
StorageLive(_13); StorageLive(_13);
StorageLive(_14); StorageLive(_14);
_14 = &(*_4); - _14 = &(*_4);
+ _14 = &(*_1);
_13 = core::str::<impl str>::as_ptr(move _14) -> [return: bb4, unwind continue]; _13 = core::str::<impl str>::as_ptr(move _14) -> [return: bb4, unwind continue];
} }
@ -135,9 +136,11 @@
_8 = (move _9, move _12); _8 = (move _9, move _12);
StorageDead(_12); StorageDead(_12);
StorageDead(_9); StorageDead(_9);
StorageLive(_15); - StorageLive(_15);
+ nop;
_15 = (_8.0: &*const u8); _15 = (_8.0: &*const u8);
StorageLive(_16); - StorageLive(_16);
+ nop;
_16 = (_8.1: &*const u8); _16 = (_8.1: &*const u8);
StorageLive(_17); StorageLive(_17);
StorageLive(_18); StorageLive(_18);
@ -153,8 +156,10 @@
StorageDead(_18); StorageDead(_18);
_7 = const (); _7 = const ();
StorageDead(_17); StorageDead(_17);
StorageDead(_16); - StorageDead(_16);
StorageDead(_15); - StorageDead(_15);
+ nop;
+ nop;
StorageDead(_13); StorageDead(_13);
StorageDead(_10); StorageDead(_10);
StorageDead(_8); StorageDead(_8);
@ -184,11 +189,13 @@
- _23 = move _21; - _23 = move _21;
+ _23 = const core::panicking::AssertKind::Eq; + _23 = const core::panicking::AssertKind::Eq;
StorageLive(_24); StorageLive(_24);
StorageLive(_25); - StorageLive(_25);
+ nop;
_25 = &(*_15); _25 = &(*_15);
_24 = &(*_25); _24 = &(*_25);
StorageLive(_26); StorageLive(_26);
StorageLive(_27); - StorageLive(_27);
+ nop;
_27 = &(*_16); _27 = &(*_16);
_26 = &(*_27); _26 = &(*_27);
StorageLive(_28); StorageLive(_28);
@ -225,9 +232,11 @@
_34 = (move _35, move _38); _34 = (move _35, move _38);
StorageDead(_38); StorageDead(_38);
StorageDead(_35); StorageDead(_35);
StorageLive(_41); - StorageLive(_41);
+ nop;
_41 = (_34.0: &*const u8); _41 = (_34.0: &*const u8);
StorageLive(_42); - StorageLive(_42);
+ nop;
_42 = (_34.1: &*const u8); _42 = (_34.1: &*const u8);
StorageLive(_43); StorageLive(_43);
StorageLive(_44); StorageLive(_44);
@ -243,8 +252,10 @@
StorageDead(_44); StorageDead(_44);
_33 = const (); _33 = const ();
StorageDead(_43); StorageDead(_43);
StorageDead(_42); - StorageDead(_42);
StorageDead(_41); - StorageDead(_41);
+ nop;
+ nop;
StorageDead(_39); StorageDead(_39);
StorageDead(_36); StorageDead(_36);
StorageDead(_34); StorageDead(_34);
@ -270,11 +281,13 @@
- _49 = move _47; - _49 = move _47;
+ _49 = const core::panicking::AssertKind::Eq; + _49 = const core::panicking::AssertKind::Eq;
StorageLive(_50); StorageLive(_50);
StorageLive(_51); - StorageLive(_51);
+ nop;
_51 = &(*_41); _51 = &(*_41);
_50 = &(*_51); _50 = &(*_51);
StorageLive(_52); StorageLive(_52);
StorageLive(_53); - StorageLive(_53);
+ nop;
_53 = &(*_42); _53 = &(*_42);
_52 = &(*_53); _52 = &(*_53);
StorageLive(_54); StorageLive(_54);

View file

@ -737,7 +737,8 @@
StorageDead(_125); StorageDead(_125);
StorageDead(_126); StorageDead(_126);
StorageDead(_124); StorageDead(_124);
StorageLive(_128); - StorageLive(_128);
+ nop;
_128 = &_3; _128 = &_3;
StorageLive(_129); StorageLive(_129);
- StorageLive(_130); - StorageLive(_130);
@ -778,7 +779,8 @@
bb32: { bb32: {
StorageDead(_134); StorageDead(_134);
StorageDead(_133); StorageDead(_133);
StorageLive(_137); - StorageLive(_137);
+ nop;
_137 = &mut _3; _137 = &mut _3;
StorageLive(_138); StorageLive(_138);
StorageLive(_139); StorageLive(_139);
@ -813,7 +815,8 @@
StorageDead(_143); StorageDead(_143);
StorageDead(_142); StorageDead(_142);
StorageLive(_146); StorageLive(_146);
StorageLive(_147); - StorageLive(_147);
+ nop;
_147 = &raw const _3; _147 = &raw const _3;
StorageLive(_148); StorageLive(_148);
StorageLive(_149); StorageLive(_149);
@ -847,7 +850,8 @@
bb36: { bb36: {
StorageDead(_153); StorageDead(_153);
StorageDead(_152); StorageDead(_152);
StorageLive(_156); - StorageLive(_156);
+ nop;
_156 = &raw mut _3; _156 = &raw mut _3;
StorageLive(_157); StorageLive(_157);
StorageLive(_158); StorageLive(_158);
@ -882,10 +886,13 @@
StorageDead(_162); StorageDead(_162);
StorageDead(_161); StorageDead(_161);
_146 = const (); _146 = const ();
StorageDead(_156); - StorageDead(_156);
StorageDead(_147); - StorageDead(_147);
+ nop;
+ nop;
StorageDead(_146); StorageDead(_146);
StorageLive(_165); - StorageLive(_165);
+ nop;
_165 = &_3; _165 = &_3;
StorageLive(_166); StorageLive(_166);
- StorageLive(_167); - StorageLive(_167);
@ -927,9 +934,12 @@
StorageDead(_171); StorageDead(_171);
StorageDead(_170); StorageDead(_170);
_0 = const (); _0 = const ();
StorageDead(_165); - StorageDead(_165);
StorageDead(_137); - StorageDead(_137);
StorageDead(_128); - StorageDead(_128);
+ nop;
+ nop;
+ nop;
return; return;
} }
} }

View file

@ -737,7 +737,8 @@
StorageDead(_125); StorageDead(_125);
StorageDead(_126); StorageDead(_126);
StorageDead(_124); StorageDead(_124);
StorageLive(_128); - StorageLive(_128);
+ nop;
_128 = &_3; _128 = &_3;
StorageLive(_129); StorageLive(_129);
- StorageLive(_130); - StorageLive(_130);
@ -778,7 +779,8 @@
bb32: { bb32: {
StorageDead(_134); StorageDead(_134);
StorageDead(_133); StorageDead(_133);
StorageLive(_137); - StorageLive(_137);
+ nop;
_137 = &mut _3; _137 = &mut _3;
StorageLive(_138); StorageLive(_138);
StorageLive(_139); StorageLive(_139);
@ -813,7 +815,8 @@
StorageDead(_143); StorageDead(_143);
StorageDead(_142); StorageDead(_142);
StorageLive(_146); StorageLive(_146);
StorageLive(_147); - StorageLive(_147);
+ nop;
_147 = &raw const _3; _147 = &raw const _3;
StorageLive(_148); StorageLive(_148);
StorageLive(_149); StorageLive(_149);
@ -847,7 +850,8 @@
bb36: { bb36: {
StorageDead(_153); StorageDead(_153);
StorageDead(_152); StorageDead(_152);
StorageLive(_156); - StorageLive(_156);
+ nop;
_156 = &raw mut _3; _156 = &raw mut _3;
StorageLive(_157); StorageLive(_157);
StorageLive(_158); StorageLive(_158);
@ -882,10 +886,13 @@
StorageDead(_162); StorageDead(_162);
StorageDead(_161); StorageDead(_161);
_146 = const (); _146 = const ();
StorageDead(_156); - StorageDead(_156);
StorageDead(_147); - StorageDead(_147);
+ nop;
+ nop;
StorageDead(_146); StorageDead(_146);
StorageLive(_165); - StorageLive(_165);
+ nop;
_165 = &_3; _165 = &_3;
StorageLive(_166); StorageLive(_166);
- StorageLive(_167); - StorageLive(_167);
@ -927,9 +934,12 @@
StorageDead(_171); StorageDead(_171);
StorageDead(_170); StorageDead(_170);
_0 = const (); _0 = const ();
StorageDead(_165); - StorageDead(_165);
StorageDead(_137); - StorageDead(_137);
StorageDead(_128); - StorageDead(_128);
+ nop;
+ nop;
+ nop;
return; return;
} }
} }