diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2021-12-18 08:16:30 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-18 08:16:30 +0100 |
| commit | 816cda7e1b0cc9a08baa5e44e1e3875b2a70c96e (patch) | |
| tree | 70cc474134e87ce02a5851b5236fd85b03252c10 /compiler/rustc_mir_transform/src | |
| parent | fcc59794a73f3181e196f65e6f7bba536edd09b0 (diff) | |
| parent | d48dbdc080f45f36ffc756de35c1443f2e05f527 (diff) | |
| download | rust-816cda7e1b0cc9a08baa5e44e1e3875b2a70c96e.tar.gz rust-816cda7e1b0cc9a08baa5e44e1e3875b2a70c96e.zip | |
Rollup merge of #91975 - cjgillot:noinline-generator, r=jackh726
Move generator check earlier in inlining. Inlining into generator may create references to other generators. For instance, inlining `Pin::<&mut from_generator::GenFuture<[generator1]>>::new_unchecked` into `generator2`. This cross reference can then create cycles when computing inlining for `generator1`. In order to avoid this kind of surprises, we forbid all inlining into generators, and rely on LLVM to do the right thing. The existing `remove-zst-query-cycle` already ICEs in inline-mir mode, so we use it as test. Split from #91743.
Diffstat (limited to 'compiler/rustc_mir_transform/src')
| -rw-r--r-- | compiler/rustc_mir_transform/src/inline.rs | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/compiler/rustc_mir_transform/src/inline.rs b/compiler/rustc_mir_transform/src/inline.rs index 558b1ce082e..8be95b2d95a 100644 --- a/compiler/rustc_mir_transform/src/inline.rs +++ b/compiler/rustc_mir_transform/src/inline.rs @@ -68,6 +68,12 @@ fn inline<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> bool { if body.source.promoted.is_some() { 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 { tcx, @@ -202,14 +208,6 @@ impl<'tcx> Inliner<'tcx> { 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); - // 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 // a lower `HirId` than the callee. This ensures that the callee will // not inline us. This trick only works without incremental compilation. |
