rust/compiler/rustc_middle/src
bors f34cc658eb Auto merge of #106612 - JakobDegen:cleanup-wf, r=tmiasko
Document wf constraints on control flow in cleanup blocks

Was recently made aware of [this code](a377893da2/compiler/rustc_codegen_ssa/src/mir/analyze.rs (L247-L368)), which has this potential ICE: a377893da2/compiler/rustc_codegen_ssa/src/mir/analyze.rs (L308-L314)

Roughly speaking, the code there is attempting to partition the cleanup blocks into funclets that satisfy a "unique successor" property, and the ICE is set off if that's not possible. This PR documents the well-formedness constraints that MIR must satisfy to avoid setting off that ICE.

The constraints documented are slightly stronger than the cases in which the ICE would have been set off in that code. This is necessary though, since whether or not that ICE gets set off can depend on iteration order in some graphs.

This sort of constraint is kind of ugly, but I don't know a better alternative at the moment. It's worth knowing that two important optimizations are still correct:
 - Removing edges in the cfg: Fewer edges => fewer paths => stronger dominance relations => more contractions, and more contractions can't turn a forest into not-a-forest.
 - Contracting an edge u -> v when u only has one successor and v only has one predecessor: u already dominated v, so this contraction was going to happen anyway.

There is definitely a MIR opt somewhere that can run afoul of this, but I don't know where it is. `@saethlin` was able to set it off though, so maybe he'll be able to shed some light on it.

r? `@RalfJung` I suppose, and cc `@tmiasko` who might have insight/opinions on this
2023-01-17 11:34:35 +00:00
..
dep_graph rustc: Remove needless lifetimes 2022-12-20 22:10:40 +01:00
hir change impl_trait_ref query to return EarlyBinder; remove bound_impl_trait_ref query; add EarlyBinder to impl_trait_ref in metadata 2023-01-14 00:29:56 -07:00
infer Simplify some canonical type alias names 2023-01-03 01:16:10 +00:00
middle rustc: Remove needless lifetimes 2022-12-20 22:10:40 +01:00
mir Add cycle checking to cleanup control flow validation 2023-01-16 14:51:33 -08:00
query change impl_trait_ref query to return EarlyBinder; remove bound_impl_trait_ref query; add EarlyBinder to impl_trait_ref in metadata 2023-01-14 00:29:56 -07:00
thir Use boxed slices in PatKind. 2022-09-02 07:26:22 +10:00
traits Unify Opaque/Projection handling in region outlives code 2023-01-13 23:53:28 +00:00
ty Rollup merge of #106953 - kylematsuda:early-binder-docs, r=jackh726 2023-01-17 05:25:23 +01:00
util Add some docs to bug, span_bug and delay_span_bug 2022-12-30 16:47:56 +01:00
arena.rs Remove output_filenames field from TyCtxt and feed the query instead 2023-01-12 17:14:17 +00:00
error.rs Match crate and slug names 2022-11-21 15:24:50 +01:00
lib.rs Only allow feeding a value to newly created definitions. 2022-11-29 18:43:00 +00:00
lint.rs create helper function for rustc_lint_defs::Level and remove it's duplicated code r=ozkanonur 2023-01-10 10:56:17 +03:00
macros.rs Add some docs to bug, span_bug and delay_span_bug 2022-12-30 16:47:56 +01:00
metadata.rs rustc: Parameterize ty::Visibility over used ID 2022-09-07 13:35:41 +04:00
tests.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
thir.rs Migrate deconstruct_pat.rs 2023-01-11 14:39:49 -08:00
values.rs add EarlyBinder::subst_identity; impl ParameterizedOverTcx (needed for rustc_metadata) and Value for EarlyBinder 2023-01-14 00:13:06 -07:00