rust/compiler/rustc_mir_transform/src
bors 4a03f14b09 Auto merge of #110569 - saethlin:mir-pass-cooperation, r=cjgillot
Deduplicate unreachable blocks, for real this time

In https://github.com/rust-lang/rust/pull/106428 (in particular https://github.com/rust-lang/rust/pull/106428/commits/41eda69516dd3ee217ae07c0efa369d31f630405) we noticed that inlining `unreachable_unchecked` can produce duplicate unreachable blocks. So we improved two MIR optimizations: `SimplifyCfg` was given a simplify to deduplicate unreachable blocks, then `InstCombine` was given a combiner to deduplicate switch targets that point at the same block. The problem is that change doesn't actually work.

Our current pass order is
```
SimplifyCfg (does nothing relevant to this situation)
Inline (produces multiple unreachable blocks)
InstCombine (doesn't do anything here, oops)
SimplifyCfg (produces the duplicate SwitchTargets that InstCombine is looking for)
```

So in here, I have factored out the specific function from `InstCombine` and placed it inside the simplify that produces the case it is looking for. This should ensure that it runs in the scenario it was designed for.

Fixes https://github.com/rust-lang/rust/issues/110551
r? `@cjgillot`
2023-04-21 15:08:02 +00:00
..
coverage Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
inline Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
abort_unwinding_calls.rs Add UnwindAction::Terminate 2023-04-06 09:34:16 +01:00
add_call_guards.rs UnwindAction::Terminate edge is also critical edge 2023-04-06 22:24:47 +01:00
add_moves_for_packed_drops.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
add_retag.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
check_alignment.rs Only emit alignment checks if we have a panic_impl 2023-04-13 10:58:00 -04:00
check_const_item_mutation.rs Move some utils out of rustc_const_eval 2023-04-16 12:05:54 +02:00
check_packed_ref.rs Properly check for builtin derives 2023-02-16 19:44:03 +00:00
check_unsafety.rs Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
cleanup_post_borrowck.rs Introduce a no-op PlaceMention statement for let _ =. 2023-03-09 17:45:13 +00:00
const_debuginfo.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
const_goto.rs Disable ConstGoto opt in cleanup blocks 2023-01-26 03:50:37 -08:00
const_prop.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
const_prop_lint.rs fix clippy::toplevel_ref_arg and ::manual_map 2023-04-16 13:28:13 +02:00
copy_prop.rs Use &IndexSlice instead of &IndexVec where possible 2023-04-02 17:35:37 -07:00
ctfe_limit.rs don't into self 2023-02-16 18:30:25 +01:00
dataflow_const_prop.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
dead_store_elimination.rs Introduce a no-op PlaceMention statement for let _ =. 2023-03-09 17:45:13 +00:00
deduce_param_attrs.rs Check freeze with right param-env 2023-04-16 23:09:57 +00:00
deduplicate_blocks.rs Replace Body::basic_blocks() with field access 2022-08-26 14:27:08 +02:00
deref_separator.rs Wrap the whole LocalInfo in ClearCrossCrate. 2023-03-14 20:52:42 +01:00
dest_prop.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
dump_mir.rs Auto merge of #105220 - oli-obk:feeding, r=cjgillot 2022-12-06 03:47:41 +00:00
early_otherwise_branch.rs Remove unneeded field from SwitchTargets 2022-12-09 04:53:10 -08:00
elaborate_box_derefs.rs Update ty::VariantDef to use IndexVec<FieldIdx, FieldDef> 2023-03-30 09:23:40 -07:00
elaborate_drops.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
ffi_unwind_calls.rs Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
function_item_references.rs Move GenericArgKind::as_{type,const,region} to GenericArg 2023-04-19 17:59:30 +00:00
generator.rs Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
inline.rs Permit MIR inlining without #[inline] 2023-04-07 15:46:43 -04:00
instcombine.rs Run combine_duplicate_switch_targets after the simplification that produces them 2023-04-20 20:40:01 -04:00
large_enums.rs Remove uses of box_syntax in rustc and tools 2023-03-12 13:19:46 +00:00
lib.rs Remove WithOptconstParam. 2023-04-20 17:48:32 +00:00
lower_intrinsics.rs Move mir::Fieldabi::FieldIdx 2023-03-28 22:22:37 -07:00
lower_slice_len.rs Add UnwindAction::Terminate 2023-04-06 09:34:16 +01:00
match_branches.rs Remove unneeded field from SwitchTargets 2022-12-09 04:53:10 -08:00
multiple_return_terminators.rs Replace Body::basic_blocks() with field access 2022-08-26 14:27:08 +02:00
normalize_array_len.rs Remove obsolete comment. 2023-01-29 22:09:51 +00:00
nrvo.rs Remove LocalKind::Var. 2023-03-14 20:52:42 +01:00
pass_manager.rs Use zero based indexing for pass_count 2022-12-02 15:55:24 +00:00
remove_noop_landing_pads.rs Rename Abort terminator to Terminate 2023-04-06 09:34:16 +01:00
remove_storage_markers.rs Make MIR basic blocks field public 2022-07-07 08:11:49 +02:00
remove_uninit_drops.rs Move mir::Fieldabi::FieldIdx 2023-03-28 22:22:37 -07:00
remove_unneeded_drops.rs Make MIR basic blocks field public 2022-07-07 08:11:49 +02:00
remove_zsts.rs Generalize operation. 2023-03-13 18:22:55 +00:00
required_consts.rs Don't ICE when encountering ConstKind::Error in RequiredConstsVisitor 2022-11-10 05:14:04 +00:00
reveal_all.rs Add option to mir::MutVisitor to not invalidate CFG. 2022-08-09 01:51:10 -07:00
separate_const_switch.rs Rename Abort terminator to Terminate 2023-04-06 09:34:16 +01:00
shim.rs refactor SimlifyCfg and friends - no globals, just enums 2023-04-18 12:30:00 -06:00
simplify.rs Run combine_duplicate_switch_targets after the simplification that produces them 2023-04-20 20:40:01 -04:00
simplify_branches.rs refactor SimlifyCfg and friends - no globals, just enums 2023-04-18 12:30:00 -06:00
simplify_comparison_integral.rs Remove unneeded field from SwitchTargets 2022-12-09 04:53:10 -08:00
sroa.rs Move mir::Fieldabi::FieldIdx 2023-03-28 22:22:37 -07:00
ssa.rs Spelling - compiler 2023-04-17 16:09:18 -04:00
uninhabited_enum_branching.rs move things from rustc_target::abi to rustc_abi 2022-11-24 16:26:13 +03:30
unreachable_prop.rs Fix typos in compiler 2023-04-10 22:02:52 +02:00