Move generator check earlier in inlining.
This commit is contained in:
parent
4a66a704b2
commit
d48dbdc080
@ -68,6 +68,12 @@ fn inline<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool {
|
|||||||
if body.source.promoted.is_some() {
|
if body.source.promoted.is_some() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// Avoid inlining into generators, since their `optimized_mir` is used for layout computation,
|
||||||
|
// which can create a cycle, even when no attempt is made to inline the function in the other
|
||||||
|
// direction.
|
||||||
|
if body.generator.is_some() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
let mut this = Inliner {
|
let mut this = Inliner {
|
||||||
tcx,
|
tcx,
|
||||||
@ -202,14 +208,6 @@ impl<'tcx> Inliner<'tcx> {
|
|||||||
|
|
||||||
if let Some(callee_def_id) = callee.def_id().as_local() {
|
if let Some(callee_def_id) = callee.def_id().as_local() {
|
||||||
let callee_hir_id = self.tcx.hir().local_def_id_to_hir_id(callee_def_id);
|
let callee_hir_id = self.tcx.hir().local_def_id_to_hir_id(callee_def_id);
|
||||||
// Avoid inlining into generators,
|
|
||||||
// since their `optimized_mir` is used for layout computation, which can
|
|
||||||
// create a cycle, even when no attempt is made to inline the function
|
|
||||||
// in the other direction.
|
|
||||||
if caller_body.generator.is_some() {
|
|
||||||
return Err("local generator (query cycle avoidance)");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Avoid a cycle here by only using `instance_mir` only if we have
|
// Avoid a cycle here by only using `instance_mir` only if we have
|
||||||
// a lower `HirId` than the callee. This ensures that the callee will
|
// a lower `HirId` than the callee. This ensures that the callee will
|
||||||
// not inline us. This trick only works without incremental compilation.
|
// not inline us. This trick only works without incremental compilation.
|
||||||
|
@ -20,21 +20,16 @@ fn main::{closure#0}(_1: *mut [generator@$DIR/generator-drop-cleanup.rs:10:15: 1
|
|||||||
let _3: std::string::String; // in scope 0 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
let _3: std::string::String; // in scope 0 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
||||||
let _4: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
let _4: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
||||||
let mut _5: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
let mut _5: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:12:9: 12:14
|
||||||
let mut _7: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:10:18: 10:18
|
let mut _6: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:10:18: 10:18
|
||||||
let mut _8: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
let mut _7: (); // in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
||||||
let mut _9: u32; // in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
let mut _8: u32; // in scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
||||||
scope 1 {
|
scope 1 {
|
||||||
debug _s => (((*_1) as variant#3).0: std::string::String); // in scope 1 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
debug _s => (((*_1) as variant#3).0: std::string::String); // in scope 1 at $DIR/generator-drop-cleanup.rs:11:13: 11:15
|
||||||
}
|
}
|
||||||
scope 2 (inlined String::new) { // at $DIR/generator-drop-cleanup.rs:11:18: 11:31
|
|
||||||
let mut _6: std::vec::Vec<u8>; // in scope 2 at $DIR/generator-drop-cleanup.rs:11:18: 11:31
|
|
||||||
scope 3 (inlined Vec::<u8>::new) { // at $DIR/generator-drop-cleanup.rs:11:18: 11:31
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
_9 = discriminant((*_1)); // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
_8 = discriminant((*_1)); // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
||||||
switchInt(move _9) -> [0_u32: bb7, 3_u32: bb10, otherwise: bb11]; // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
switchInt(move _8) -> [0_u32: bb7, 3_u32: bb10, otherwise: bb11]; // scope 0 at $DIR/generator-drop-cleanup.rs:10:15: 13:6
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// optimized mir -> remove zsts -> layout of a generator -> optimized mir.
|
// optimized mir -> remove zsts -> layout of a generator -> optimized mir.
|
||||||
//
|
//
|
||||||
// edition:2018
|
// edition:2018
|
||||||
// compile-flags: --crate-type=lib
|
// compile-flags: --crate-type=lib -Zinline-mir=yes
|
||||||
// build-pass
|
// build-pass
|
||||||
|
|
||||||
pub async fn listen() -> Result<(), std::io::Error> {
|
pub async fn listen() -> Result<(), std::io::Error> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user