From bec4fc175aaab3a9b633b99642aa8e96375d3e89 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sun, 15 Dec 2019 14:07:30 -0500 Subject: [mir-opt] Fix `Inline` pass to handle inlining into `box` expressions --- src/librustc_mir/transform/inline.rs | 30 ++++++---- src/test/mir-opt/inline/inline-into-box-place.rs | 71 ++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 src/test/mir-opt/inline/inline-into-box-place.rs diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs index 9763913082d..dca14227946 100644 --- a/src/librustc_mir/transform/inline.rs +++ b/src/librustc_mir/transform/inline.rs @@ -663,9 +663,9 @@ impl<'a, 'tcx> Integrator<'a, 'tcx> { fn make_integrate_local(&self, local: &Local) -> Local { if *local == RETURN_PLACE { - match self.destination.as_local() { - Some(l) => return l, - ref place => bug!("Return place is {:?}, not local", place), + match self.destination.base { + PlaceBase::Local(l) => return l, + PlaceBase::Static(ref s) => bug!("Return place is {:?}, not local", s), } } @@ -695,14 +695,24 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> { fn visit_place( &mut self, place: &mut Place<'tcx>, - context: PlaceContext, - location: Location, + _context: PlaceContext, + _location: Location, ) { - if let Some(RETURN_PLACE) = place.as_local() { - // Return pointer; update the place itself - *place = self.destination.clone(); - } else { - self.super_place(place, context, location); + match &mut place.base { + PlaceBase::Static(_) => {}, + PlaceBase::Local(l) => { + // If this is the `RETURN_PLACE`, we need to rebase any projections onto it. + let dest_proj_len = self.destination.projection.len(); + if *l == RETURN_PLACE && dest_proj_len > 0 { + let mut projs = Vec::with_capacity(dest_proj_len + place.projection.len()); + projs.extend(self.destination.projection); + projs.extend(place.projection); + + place.projection = self.tcx.intern_place_elems(&*projs); + } + + *l = self.make_integrate_local(l); + } } } diff --git a/src/test/mir-opt/inline/inline-into-box-place.rs b/src/test/mir-opt/inline/inline-into-box-place.rs new file mode 100644 index 00000000000..0bb9dfa403d --- /dev/null +++ b/src/test/mir-opt/inline/inline-into-box-place.rs @@ -0,0 +1,71 @@ +// ignore-tidy-linelength +// ignore-wasm32-bare compiled with panic=abort by default +#![feature(box_syntax)] + +fn main() { + let _x: Box> = box Vec::new(); +} + +// END RUST SOURCE +// START rustc.main.Inline.before.mir +// let mut _0: (); +// let _1: std::boxed::Box> as UserTypeProjection { base: UserType(0), projs: [] }; +// let mut _2: std::boxed::Box>; +// let mut _3: (); +// scope 1 { +// debug _x => _1; +// } +// bb0: { +// StorageLive(_1); +// StorageLive(_2); +// _2 = Box(std::vec::Vec); +// (*_2) = const std::vec::Vec::::new() -> [return: bb2, unwind: bb4]; +// } +// bb1 (cleanup): { +// resume; +// } +// bb2: { +// _1 = move _2; +// StorageDead(_2); +// _0 = (); +// drop(_1) -> [return: bb3, unwind: bb1]; +// } +// bb3: { +// StorageDead(_1); +// return; +// } +// bb4 (cleanup): { +// _3 = const alloc::alloc::box_free::>(move (_2.0: std::ptr::Unique>)) -> bb1; +// } +// END rustc.main.Inline.before.mir +// START rustc.main.Inline.after.mir +// let mut _0: (); +// let _1: std::boxed::Box> as UserTypeProjection { base: UserType(0), projs: [] }; +// let mut _2: std::boxed::Box>; +// let mut _3: (); +// let mut _4: &mut std::vec::Vec; +// scope 1 { +// debug _x => _1; +// } +// scope 2 { +// } +// bb0: { +// StorageLive(_1); +// StorageLive(_2); +// _2 = Box(std::vec::Vec); +// _4 = &mut (*_2); +// ((*_4).0: alloc::raw_vec::RawVec) = const alloc::raw_vec::RawVec::::NEW; +// ((*_4).1: usize) = const 0usize; +// _1 = move _2; +// StorageDead(_2); +// _0 = (); +// drop(_1) -> [return: bb2, unwind: bb1]; +// } +// bb1 (cleanup): { +// resume; +// } +// bb2: { +// StorageDead(_1); +// return; +// } +// END rustc.main.Inline.after.mir -- cgit 1.4.1-3-g733a5 From f1325a78e6567d86d4c83d21477097b8ee3f7526 Mon Sep 17 00:00:00 2001 From: Wesley Wiser Date: Sun, 15 Dec 2019 15:37:28 -0500 Subject: Move the rest of the mir-opt inline tests into a folder --- src/test/mir-opt/inline-any-operand.rs | 29 ----------- src/test/mir-opt/inline-closure-borrows-arg.rs | 59 --------------------- src/test/mir-opt/inline-closure-captures.rs | 60 ---------------------- src/test/mir-opt/inline-closure.rs | 50 ------------------ src/test/mir-opt/inline-retag.rs | 37 ------------- src/test/mir-opt/inline-trait-method.rs | 31 ----------- src/test/mir-opt/inline-trait-method_2.rs | 36 ------------- src/test/mir-opt/inline/inline-any-operand.rs | 29 +++++++++++ .../mir-opt/inline/inline-closure-borrows-arg.rs | 59 +++++++++++++++++++++ src/test/mir-opt/inline/inline-closure-captures.rs | 60 ++++++++++++++++++++++ src/test/mir-opt/inline/inline-closure.rs | 50 ++++++++++++++++++ src/test/mir-opt/inline/inline-retag.rs | 37 +++++++++++++ src/test/mir-opt/inline/inline-trait-method.rs | 31 +++++++++++ src/test/mir-opt/inline/inline-trait-method_2.rs | 36 +++++++++++++ 14 files changed, 302 insertions(+), 302 deletions(-) delete mode 100644 src/test/mir-opt/inline-any-operand.rs delete mode 100644 src/test/mir-opt/inline-closure-borrows-arg.rs delete mode 100644 src/test/mir-opt/inline-closure-captures.rs delete mode 100644 src/test/mir-opt/inline-closure.rs delete mode 100644 src/test/mir-opt/inline-retag.rs delete mode 100644 src/test/mir-opt/inline-trait-method.rs delete mode 100644 src/test/mir-opt/inline-trait-method_2.rs create mode 100644 src/test/mir-opt/inline/inline-any-operand.rs create mode 100644 src/test/mir-opt/inline/inline-closure-borrows-arg.rs create mode 100644 src/test/mir-opt/inline/inline-closure-captures.rs create mode 100644 src/test/mir-opt/inline/inline-closure.rs create mode 100644 src/test/mir-opt/inline/inline-retag.rs create mode 100644 src/test/mir-opt/inline/inline-trait-method.rs create mode 100644 src/test/mir-opt/inline/inline-trait-method_2.rs diff --git a/src/test/mir-opt/inline-any-operand.rs b/src/test/mir-opt/inline-any-operand.rs deleted file mode 100644 index b5455003719..00000000000 --- a/src/test/mir-opt/inline-any-operand.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -Z span_free_formats - -// Tests that MIR inliner works for any operand - -fn main() { - println!("{}", bar()); -} - -fn bar() -> bool { - let f = foo; - f(1, -1) -} - -#[inline(always)] -fn foo(x: i32, y: i32) -> bool { - x == y -} - -// END RUST SOURCE -// START rustc.bar.Inline.after.mir -// ... -// bb0: { -// ... -// _0 = Eq(move _3, move _4); -// ... -// return; -// } -// ... -// END rustc.bar.Inline.after.mir diff --git a/src/test/mir-opt/inline-closure-borrows-arg.rs b/src/test/mir-opt/inline-closure-borrows-arg.rs deleted file mode 100644 index 768f4953228..00000000000 --- a/src/test/mir-opt/inline-closure-borrows-arg.rs +++ /dev/null @@ -1,59 +0,0 @@ -// compile-flags: -Z span_free_formats - -// Tests that MIR inliner can handle closure arguments, -// even when (#45894) - -fn main() { - println!("{}", foo(0, &14)); -} - -fn foo(_t: T, q: &i32) -> i32 { - let x = |r: &i32, _s: &i32| { - let variable = &*r; - *variable - }; - x(q, q) -} - -// END RUST SOURCE -// START rustc.foo.Inline.after.mir -// fn foo(_1: T, _2: &i32) -> i32{ -// debug _t => _1; -// debug q => _2; -// let mut _0: i32; -// let _3: [closure@foo::{{closure}}#0]; -// let mut _4: &[closure@foo::{{closure}}#0]; -// let mut _5: (&i32, &i32); -// let mut _6: &i32; -// let mut _7: &i32; -// let mut _8: &i32; -// let mut _9: &i32; -// scope 1 { -// debug x => _3; -// scope 2 { -// debug r => _8; -// debug _s => _9; -// } -// } -// scope 3 { -// debug variable => _8; -// } -// bb0: { -// ... -// _3 = [closure@foo::::{{closure}}#0]; -// ... -// _4 = &_3; -// ... -// _6 = &(*_2); -// ... -// _7 = &(*_2); -// _5 = (move _6, move _7); -// _8 = move (_5.0: &i32); -// _9 = move (_5.1: &i32); -// ... -// _0 = (*_8); -// ... -// return; -// } -// } -// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline-closure-captures.rs b/src/test/mir-opt/inline-closure-captures.rs deleted file mode 100644 index e000a418d90..00000000000 --- a/src/test/mir-opt/inline-closure-captures.rs +++ /dev/null @@ -1,60 +0,0 @@ -// compile-flags: -Z span_free_formats - -// Tests that MIR inliner can handle closure captures. - -fn main() { - println!("{:?}", foo(0, 14)); -} - -fn foo(t: T, q: i32) -> (i32, T) { - let x = |_q| (q, t); - x(q) -} - -// END RUST SOURCE -// START rustc.foo.Inline.after.mir -// fn foo(_1: T, _2: i32) -> (i32, T){ -// debug t => _1; -// debug q => _2; -// let mut _0: (i32, T); -// let _3: [closure@foo::{{closure}}#0 q:&i32, t:&T]; -// let mut _4: &i32; -// let mut _5: &T; -// let mut _6: &[closure@foo::{{closure}}#0 q:&i32, t:&T]; -// let mut _7: (i32,); -// let mut _8: i32; -// let mut _11: i32; -// scope 1 { -// debug x => _3; -// scope 2 { -// debug _q => _11; -// debug q => (*((*_6).0: &i32)); -// debug t => (*((*_6).1: &T)); -// let mut _9: i32; -// let mut _10: T; -// } -// } -// bb0: { -// ... -// _4 = &_2; -// ... -// _5 = &_1; -// _3 = [closure@foo::::{{closure}}#0] { q: move _4, t: move _5 }; -// ... -// _6 = &_3; -// ... -// ... -// _8 = _2; -// _7 = (move _8,); -// _11 = move (_7.0: i32); -// ... -// _9 = (*((*_6).0: &i32)); -// ... -// _10 = (*((*_6).1: &T)); -// (_0.0: i32) = move _9; -// (_0.1: T) = move _10; -// ... -// return; -// } -// } -// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline-closure.rs b/src/test/mir-opt/inline-closure.rs deleted file mode 100644 index bd36e77818e..00000000000 --- a/src/test/mir-opt/inline-closure.rs +++ /dev/null @@ -1,50 +0,0 @@ -// compile-flags: -Z span_free_formats - -// Tests that MIR inliner can handle closure arguments. (#45894) - -fn main() { - println!("{}", foo(0, 14)); -} - -fn foo(_t: T, q: i32) -> i32 { - let x = |_t, _q| _t; - x(q, q) -} - -// END RUST SOURCE -// START rustc.foo.Inline.after.mir -// fn foo(_1: T, _2: i32) -> i32{ -// debug _t => _1; -// debug q => _2; -// let mut _0: i32; -// let _3: [closure@foo::{{closure}}#0]; -// let mut _4: &[closure@foo::{{closure}}#0]; -// let mut _5: (i32, i32); -// let mut _6: i32; -// let mut _7: i32; -// let mut _8: i32; -// let mut _9: i32; -// scope 1 { -// debug x => _3; -// scope 2 { -// debug _t => _8; -// debug _q => _9; -// } -// } -// bb0: { -// ... -// _3 = [closure@foo::::{{closure}}#0]; -// ... -// _4 = &_3; -// ... -// _6 = _2; -// ... -// _7 = _2; -// _5 = (move _6, move _7); -// _8 = move (_5.0: i32); -// _9 = move (_5.1: i32); -// _0 = _8; -// ... -// return; -// } -// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline-retag.rs b/src/test/mir-opt/inline-retag.rs deleted file mode 100644 index 6cdbcfdb0ad..00000000000 --- a/src/test/mir-opt/inline-retag.rs +++ /dev/null @@ -1,37 +0,0 @@ -// compile-flags: -Z span_free_formats -Z mir-emit-retag - -// Tests that MIR inliner fixes up `Retag`'s `fn_entry` flag - -fn main() { - println!("{}", bar()); -} - -fn bar() -> bool { - let f = foo; - f(&1, &-1) -} - -#[inline(always)] -fn foo(x: &i32, y: &i32) -> bool { - *x == *y -} - -// END RUST SOURCE -// START rustc.bar.Inline.after.mir -// ... -// bb0: { -// ... -// Retag(_3); -// ... -// Retag(_3); -// Retag(_6); -// StorageLive(_9); -// _9 = (*_3); -// StorageLive(_10); -// _10 = (*_6); -// _0 = Eq(move _9, move _10); -// ... -// return; -// } -// ... -// END rustc.bar.Inline.after.mir diff --git a/src/test/mir-opt/inline-trait-method.rs b/src/test/mir-opt/inline-trait-method.rs deleted file mode 100644 index a2c5fb920cd..00000000000 --- a/src/test/mir-opt/inline-trait-method.rs +++ /dev/null @@ -1,31 +0,0 @@ -// compile-flags: -Z span_free_formats - -fn main() { - println!("{}", test(&())); -} - -fn test(x: &dyn X) -> u32 { - x.y() -} - -trait X { - fn y(&self) -> u32 { - 1 - } -} - -impl X for () { - fn y(&self) -> u32 { - 2 - } -} - -// END RUST SOURCE -// START rustc.test.Inline.after.mir -// ... -// bb0: { -// ... -// _0 = const ::y(move _2) -> bb1; -// } -// ... -// END rustc.test.Inline.after.mir diff --git a/src/test/mir-opt/inline-trait-method_2.rs b/src/test/mir-opt/inline-trait-method_2.rs deleted file mode 100644 index 4ad4311113a..00000000000 --- a/src/test/mir-opt/inline-trait-method_2.rs +++ /dev/null @@ -1,36 +0,0 @@ -// compile-flags: -Z span_free_formats -Z mir-opt-level=3 - -fn test2(x: &dyn X) -> bool { - test(x) -} - -#[inline] -fn test(x: &dyn X) -> bool { - x.y() -} - -trait X { - fn y(&self) -> bool { - false - } -} - -impl X for () { - fn y(&self) -> bool { - true - } -} - -fn main() { - println!("Should be true: {}", test2(&())); -} - -// END RUST SOURCE -// START rustc.test2.Inline.after.mir -// ... -// bb0: { -// ... -// _0 = const ::y(move _2) -> bb1; -// } -// ... -// END rustc.test2.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-any-operand.rs b/src/test/mir-opt/inline/inline-any-operand.rs new file mode 100644 index 00000000000..b5455003719 --- /dev/null +++ b/src/test/mir-opt/inline/inline-any-operand.rs @@ -0,0 +1,29 @@ +// compile-flags: -Z span_free_formats + +// Tests that MIR inliner works for any operand + +fn main() { + println!("{}", bar()); +} + +fn bar() -> bool { + let f = foo; + f(1, -1) +} + +#[inline(always)] +fn foo(x: i32, y: i32) -> bool { + x == y +} + +// END RUST SOURCE +// START rustc.bar.Inline.after.mir +// ... +// bb0: { +// ... +// _0 = Eq(move _3, move _4); +// ... +// return; +// } +// ... +// END rustc.bar.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-closure-borrows-arg.rs b/src/test/mir-opt/inline/inline-closure-borrows-arg.rs new file mode 100644 index 00000000000..768f4953228 --- /dev/null +++ b/src/test/mir-opt/inline/inline-closure-borrows-arg.rs @@ -0,0 +1,59 @@ +// compile-flags: -Z span_free_formats + +// Tests that MIR inliner can handle closure arguments, +// even when (#45894) + +fn main() { + println!("{}", foo(0, &14)); +} + +fn foo(_t: T, q: &i32) -> i32 { + let x = |r: &i32, _s: &i32| { + let variable = &*r; + *variable + }; + x(q, q) +} + +// END RUST SOURCE +// START rustc.foo.Inline.after.mir +// fn foo(_1: T, _2: &i32) -> i32{ +// debug _t => _1; +// debug q => _2; +// let mut _0: i32; +// let _3: [closure@foo::{{closure}}#0]; +// let mut _4: &[closure@foo::{{closure}}#0]; +// let mut _5: (&i32, &i32); +// let mut _6: &i32; +// let mut _7: &i32; +// let mut _8: &i32; +// let mut _9: &i32; +// scope 1 { +// debug x => _3; +// scope 2 { +// debug r => _8; +// debug _s => _9; +// } +// } +// scope 3 { +// debug variable => _8; +// } +// bb0: { +// ... +// _3 = [closure@foo::::{{closure}}#0]; +// ... +// _4 = &_3; +// ... +// _6 = &(*_2); +// ... +// _7 = &(*_2); +// _5 = (move _6, move _7); +// _8 = move (_5.0: &i32); +// _9 = move (_5.1: &i32); +// ... +// _0 = (*_8); +// ... +// return; +// } +// } +// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-closure-captures.rs b/src/test/mir-opt/inline/inline-closure-captures.rs new file mode 100644 index 00000000000..e000a418d90 --- /dev/null +++ b/src/test/mir-opt/inline/inline-closure-captures.rs @@ -0,0 +1,60 @@ +// compile-flags: -Z span_free_formats + +// Tests that MIR inliner can handle closure captures. + +fn main() { + println!("{:?}", foo(0, 14)); +} + +fn foo(t: T, q: i32) -> (i32, T) { + let x = |_q| (q, t); + x(q) +} + +// END RUST SOURCE +// START rustc.foo.Inline.after.mir +// fn foo(_1: T, _2: i32) -> (i32, T){ +// debug t => _1; +// debug q => _2; +// let mut _0: (i32, T); +// let _3: [closure@foo::{{closure}}#0 q:&i32, t:&T]; +// let mut _4: &i32; +// let mut _5: &T; +// let mut _6: &[closure@foo::{{closure}}#0 q:&i32, t:&T]; +// let mut _7: (i32,); +// let mut _8: i32; +// let mut _11: i32; +// scope 1 { +// debug x => _3; +// scope 2 { +// debug _q => _11; +// debug q => (*((*_6).0: &i32)); +// debug t => (*((*_6).1: &T)); +// let mut _9: i32; +// let mut _10: T; +// } +// } +// bb0: { +// ... +// _4 = &_2; +// ... +// _5 = &_1; +// _3 = [closure@foo::::{{closure}}#0] { q: move _4, t: move _5 }; +// ... +// _6 = &_3; +// ... +// ... +// _8 = _2; +// _7 = (move _8,); +// _11 = move (_7.0: i32); +// ... +// _9 = (*((*_6).0: &i32)); +// ... +// _10 = (*((*_6).1: &T)); +// (_0.0: i32) = move _9; +// (_0.1: T) = move _10; +// ... +// return; +// } +// } +// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-closure.rs b/src/test/mir-opt/inline/inline-closure.rs new file mode 100644 index 00000000000..bd36e77818e --- /dev/null +++ b/src/test/mir-opt/inline/inline-closure.rs @@ -0,0 +1,50 @@ +// compile-flags: -Z span_free_formats + +// Tests that MIR inliner can handle closure arguments. (#45894) + +fn main() { + println!("{}", foo(0, 14)); +} + +fn foo(_t: T, q: i32) -> i32 { + let x = |_t, _q| _t; + x(q, q) +} + +// END RUST SOURCE +// START rustc.foo.Inline.after.mir +// fn foo(_1: T, _2: i32) -> i32{ +// debug _t => _1; +// debug q => _2; +// let mut _0: i32; +// let _3: [closure@foo::{{closure}}#0]; +// let mut _4: &[closure@foo::{{closure}}#0]; +// let mut _5: (i32, i32); +// let mut _6: i32; +// let mut _7: i32; +// let mut _8: i32; +// let mut _9: i32; +// scope 1 { +// debug x => _3; +// scope 2 { +// debug _t => _8; +// debug _q => _9; +// } +// } +// bb0: { +// ... +// _3 = [closure@foo::::{{closure}}#0]; +// ... +// _4 = &_3; +// ... +// _6 = _2; +// ... +// _7 = _2; +// _5 = (move _6, move _7); +// _8 = move (_5.0: i32); +// _9 = move (_5.1: i32); +// _0 = _8; +// ... +// return; +// } +// END rustc.foo.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-retag.rs b/src/test/mir-opt/inline/inline-retag.rs new file mode 100644 index 00000000000..6cdbcfdb0ad --- /dev/null +++ b/src/test/mir-opt/inline/inline-retag.rs @@ -0,0 +1,37 @@ +// compile-flags: -Z span_free_formats -Z mir-emit-retag + +// Tests that MIR inliner fixes up `Retag`'s `fn_entry` flag + +fn main() { + println!("{}", bar()); +} + +fn bar() -> bool { + let f = foo; + f(&1, &-1) +} + +#[inline(always)] +fn foo(x: &i32, y: &i32) -> bool { + *x == *y +} + +// END RUST SOURCE +// START rustc.bar.Inline.after.mir +// ... +// bb0: { +// ... +// Retag(_3); +// ... +// Retag(_3); +// Retag(_6); +// StorageLive(_9); +// _9 = (*_3); +// StorageLive(_10); +// _10 = (*_6); +// _0 = Eq(move _9, move _10); +// ... +// return; +// } +// ... +// END rustc.bar.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-trait-method.rs b/src/test/mir-opt/inline/inline-trait-method.rs new file mode 100644 index 00000000000..a2c5fb920cd --- /dev/null +++ b/src/test/mir-opt/inline/inline-trait-method.rs @@ -0,0 +1,31 @@ +// compile-flags: -Z span_free_formats + +fn main() { + println!("{}", test(&())); +} + +fn test(x: &dyn X) -> u32 { + x.y() +} + +trait X { + fn y(&self) -> u32 { + 1 + } +} + +impl X for () { + fn y(&self) -> u32 { + 2 + } +} + +// END RUST SOURCE +// START rustc.test.Inline.after.mir +// ... +// bb0: { +// ... +// _0 = const ::y(move _2) -> bb1; +// } +// ... +// END rustc.test.Inline.after.mir diff --git a/src/test/mir-opt/inline/inline-trait-method_2.rs b/src/test/mir-opt/inline/inline-trait-method_2.rs new file mode 100644 index 00000000000..4ad4311113a --- /dev/null +++ b/src/test/mir-opt/inline/inline-trait-method_2.rs @@ -0,0 +1,36 @@ +// compile-flags: -Z span_free_formats -Z mir-opt-level=3 + +fn test2(x: &dyn X) -> bool { + test(x) +} + +#[inline] +fn test(x: &dyn X) -> bool { + x.y() +} + +trait X { + fn y(&self) -> bool { + false + } +} + +impl X for () { + fn y(&self) -> bool { + true + } +} + +fn main() { + println!("Should be true: {}", test2(&())); +} + +// END RUST SOURCE +// START rustc.test2.Inline.after.mir +// ... +// bb0: { +// ... +// _0 = const ::y(move _2) -> bb1; +// } +// ... +// END rustc.test2.Inline.after.mir -- cgit 1.4.1-3-g733a5