Skip to content

Which MIR passes should run on generator drop shims? #91576

Open
@ecstatic-morse

Description

@ecstatic-morse
Contributor

Under normal circumstances, MIR shims have the following 5 passes applied:

However, generator drop shims are created by cloning the MIR for the original generator (?), which means they start out in MirPhase::GeneratorLowering. Prior to #91475, run_passes silently returned without doing anything if the MirPhase was greater than or equal to the expected one, so the aforementioned MIR passes were never executed. That behavior was only relevant when building drop shims, so #91475 added an explicit check to preserve it.

Was this intentional? Notably AddMovesForPackedDrops and AbortUnwindingCalls have soundness implications, and CriticalCallEdges is needed to work around some codegen issues, so it seems like they should always run. However, they might not be applicable to generators specifically.

Perhaps @tmandry knows the answer, or knows someone who does?

Activity

tmandry

tmandry commented on Dec 7, 2021

@tmandry
Member

I'm not sure why those passes aren't run, and I haven't done much on the code with drop shims. @Zoxc might know. @jonas-schievink also made some recent-ish changes in that code.

tmiasko

tmiasko commented on Dec 7, 2021

@tmiasko
Contributor

The AddMovesForPackedDrops and AbortUnwindingCalls should at some point run on drop shim MIR. As far as I can see, precisely because the drop shim starts as a clone of original MIR those passes are already in effect. (There are new drop terminators introduced afterwards, to drop a generator in an unresumed state, but since generator itself is not packed and drops are shallow that seems fine, since those drops will be responsible for introducing any extra moves as necessary).

On the other hand, the omission of CriticalCallEdges immediately before the code generation might be problematic.

added 2 commits that reference this issue on Dec 8, 2021

Rollup merge of rust-lang#91577 - ecstatic-morse:mir-pass-manager-cle…

bd75333

Rollup merge of rust-lang#91577 - ecstatic-morse:mir-pass-manager-cle…

4a76541
RalfJung

RalfJung commented on Dec 21, 2022

@RalfJung
Member

This issue also means that MIR validation doesn't run on generator drop shims, which makes me uneasy. Or has the validator been run somewhere earlier?

the drop shim starts as a clone of original MIR

Which original MIR and where/how is that generated?

Prior to #91475, run_passes silently returned without doing anything if the MirPhase was greater than or equal to the expected one, so the aforementioned MIR passes were never executed. That behavior was only relevant when building drop shims, so #91475 added an explicit check to preserve it.

What would go wrong if this made the same run_passes call as the other shims?

added
A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html
C-bugCategory: This is a bug.
on Feb 16, 2023
added
T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
on Apr 5, 2023
self-assigned this
on Nov 19, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-MIRArea: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.htmlA-coroutinesArea: CoroutinesC-bugCategory: This is a bug.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @RalfJung@tmandry@ecstatic-morse@Noratrieb@tmiasko

      Issue actions

        Which MIR passes should run on generator drop shims? · Issue #91576 · rust-lang/rust