rust/tests/mir-opt/pre-codegen
Jacob Pratt bc4a6431eb
Rollup merge of #142185 - saethlin:refprop-moves, r=cjgillot
Convert moves of references to copies in ReferencePropagation

This is a fix for https://github.com/rust-lang/rust/issues/141101.

The root cause of this miscompile is that the SsaLocals analysis that MIR transforms use is supposed to detect locals that are only written to once, in their single assignment. But that analysis is subtly wrong; it does not consider `Operand::Move` to be a write even though the meaning ascribed to `Operand::Move` (at least as a function parameter) by Miri is that the callee may have done arbitrary writes to the caller's Local that the Operand wraps (because `Move` is pass-by-pointer). So Miri conwiders `Operand::Move` to be a write but both the MIR visitor system considers it a read, and so does SsaLocals.

I have tried fixing this by changing the `PlaceContext` that is ascribed to an `Operand::Move` to a `MutatingUseContext` but that seems to have borrow checker implications, and changing SsaLocals seems to have wide-ranging regressions in MIR optimizations.

So instead of doing those, this PR adds a new kludge to ReferencePropagation, which follows the same line of thinking as the kludge in CopyProp that solves this same problem inside that pass: a5584a8fe1/compiler/rustc_mir_transform/src/copy_prop.rs (L65-L98)
2025-08-22 22:00:46 -04:00
..
chained_comparison.bitand.PreCodegen.after.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
chained_comparison.naive.PreCodegen.after.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
chained_comparison.returning.PreCodegen.after.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
chained_comparison.rs [AUTO_GENERATED] Migrate compiletest to use ui_test-style //@ directives 2024-02-22 16:04:04 +00:00
checked_ops.checked_shl.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
checked_ops.checked_shl.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
checked_ops.rs Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
checked_ops.saturating_sub_at_home.PreCodegen.after.panic-abort.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
checked_ops.saturating_sub_at_home.PreCodegen.after.panic-unwind.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
checked_ops.step_forward.PreCodegen.after.panic-abort.mir Update mir-opt expected output for matches! macro 2025-07-25 22:34:55 +02:00
checked_ops.step_forward.PreCodegen.after.panic-unwind.mir Update mir-opt expected output for matches! macro 2025-07-25 22:34:55 +02:00
checked_ops.use_checked_sub.PreCodegen.after.panic-abort.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
checked_ops.use_checked_sub.PreCodegen.after.panic-unwind.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
clone_as_copy.clone_as_copy.PreCodegen.after.mir Simplify the canonical clone method to copy 2024-09-14 13:30:35 +08:00
clone_as_copy.enum_clone_as_copy.PreCodegen.after.mir Simplify the canonical clone method to copy 2024-09-14 13:30:35 +08:00
clone_as_copy.rs Remove unsound-mir-opts for simplify_aggregate_to_copy 2025-04-03 21:59:43 +08:00
deref_nested_borrows.rs Revert "comment out the old tests instead of adjusting them" 2025-04-02 19:59:26 +08:00
deref_nested_borrows.src.GVN.panic-abort.diff Do not unify dereferences in GVN. 2024-11-25 20:19:08 +01:00
deref_nested_borrows.src.GVN.panic-unwind.diff Do not unify dereferences in GVN. 2024-11-25 20:19:08 +01:00
deref_nested_borrows.src.PreCodegen.after.panic-abort.mir Do not unify dereferences in GVN. 2024-11-25 20:19:08 +01:00
deref_nested_borrows.src.PreCodegen.after.panic-unwind.mir Do not unify dereferences in GVN. 2024-11-25 20:19:08 +01:00
derived_ord.demo_le.PreCodegen.after.mir Allow GVN to produce places and not just locals. 2025-04-04 10:55:36 +00:00
derived_ord.rs Make is_le and friends work like clang's 2025-03-05 21:58:46 -08:00
derived_ord.{impl#0}-partial_cmp.PreCodegen.after.mir Make is_le and friends work like clang's 2025-03-05 21:58:46 -08:00
derived_ord_debug.rs Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord) 2025-08-03 17:30:40 -07:00
derived_ord_debug.{impl#0}-partial_cmp.PreCodegen.after.panic-abort.mir Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord) 2025-08-03 17:30:40 -07:00
derived_ord_debug.{impl#0}-partial_cmp.PreCodegen.after.panic-unwind.mir Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord) 2025-08-03 17:30:40 -07:00
derived_ord_debug.{impl#1}-cmp.PreCodegen.after.panic-abort.mir Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord) 2025-08-03 17:30:40 -07:00
derived_ord_debug.{impl#1}-cmp.PreCodegen.after.panic-unwind.mir Add a mir-opt test for *debug* MIR from derive(PartialOrd, Ord) 2025-08-03 17:30:40 -07:00
drop_boxed_slice.generic_in_place.PreCodegen.after.32bit.panic-abort.mir AlignmentEnum should just be repr(usize) now 2025-07-30 00:09:01 -07:00
drop_boxed_slice.generic_in_place.PreCodegen.after.32bit.panic-unwind.mir AlignmentEnum should just be repr(usize) now 2025-07-30 00:09:01 -07:00
drop_boxed_slice.generic_in_place.PreCodegen.after.64bit.panic-abort.mir AlignmentEnum should just be repr(usize) now 2025-07-30 00:09:01 -07:00
drop_boxed_slice.generic_in_place.PreCodegen.after.64bit.panic-unwind.mir AlignmentEnum should just be repr(usize) now 2025-07-30 00:09:01 -07:00
drop_boxed_slice.rs AlignmentEnum should just be repr(usize) now 2025-07-30 00:09:01 -07:00
duplicate_switch_targets.rs Enable more mir-opt tests in debug builds 2024-03-22 20:14:39 -04:00
duplicate_switch_targets.ub_if_b.PreCodegen.after.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
intrinsics.f_u64.PreCodegen.after.mir At debuginfo=0, don't inline debuginfo when inlining 2024-04-18 09:35:35 -07:00
intrinsics.f_unit.PreCodegen.after.mir At debuginfo=0, don't inline debuginfo when inlining 2024-04-18 09:35:35 -07:00
intrinsics.rs rustfmt tests/mir-opt. 2024-06-03 14:17:16 +10:00
issue_117368_print_invalid_constant.main.GVN.32bit.panic-abort.diff Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
issue_117368_print_invalid_constant.main.GVN.32bit.panic-unwind.diff Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
issue_117368_print_invalid_constant.main.GVN.64bit.panic-abort.diff Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
issue_117368_print_invalid_constant.main.GVN.64bit.panic-unwind.diff Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
issue_117368_print_invalid_constant.rs ignore/fix layout-sensitive tests 2024-08-31 23:56:45 +02:00
loops.filter_mapped.PreCodegen.after.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
loops.int_range.PreCodegen.after.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
loops.mapped.PreCodegen.after.mir Inline FnOnce once again 2025-03-03 23:30:18 +00:00
loops.rs Remove some only- clauses from mir-opt tests 2024-03-18 10:07:43 -04:00
loops.vec_move.PreCodegen.after.mir Perform instsimplify before inline to eliminate some trivial calls 2024-07-29 18:14:35 +08:00
matchbr.match1.PreCodegen.after.mir mir-opt: execute MatchBranchSimplification after GVN 2025-04-21 21:46:44 +08:00
matchbr.rs mir-opt: execute MatchBranchSimplification after GVN 2025-04-21 21:46:44 +08:00
matches_macro.issue_77355_opt.PreCodegen.after.mir Update mir-opt expected output for matches! macro 2025-07-25 22:34:55 +02:00
matches_macro.rs Remove ConstGoto and SeparateConstSwitch. 2024-02-09 21:13:53 +00:00
mem_replace.manual_replace.PreCodegen.after.panic-abort.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
mem_replace.manual_replace.PreCodegen.after.panic-unwind.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
mem_replace.mem_replace.PreCodegen.after.panic-abort.mir Allow more top-down inlining for single-BB callees 2025-03-12 22:39:43 -07:00
mem_replace.mem_replace.PreCodegen.after.panic-unwind.mir Allow more top-down inlining for single-BB callees 2025-03-12 22:39:43 -07:00
mem_replace.rs tests: ignore-debug -> ignore-std-debug-assertions 2024-10-31 17:33:42 +08:00
no_inlined_clone.rs Perform instsimplify before inline to eliminate some trivial calls 2024-07-29 18:14:35 +08:00
no_inlined_clone.{impl#0}-clone.PreCodegen.after.mir Remove unsound-mir-opts for simplify_aggregate_to_copy 2025-04-03 21:59:43 +08:00
optimizes_into_variable.main.GVN.32bit.panic-abort.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.GVN.32bit.panic-unwind.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.GVN.64bit.panic-abort.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.GVN.64bit.panic-unwind.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.PreCodegen.after.32bit.panic-abort.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.PreCodegen.after.32bit.panic-unwind.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.PreCodegen.after.64bit.panic-abort.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.PreCodegen.after.64bit.panic-unwind.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.ScalarReplacementOfAggregates.32bit.panic-abort.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.ScalarReplacementOfAggregates.32bit.panic-unwind.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.ScalarReplacementOfAggregates.64bit.panic-abort.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.ScalarReplacementOfAggregates.64bit.panic-unwind.diff Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
optimizes_into_variable.main.SimplifyLocals-final.after.32bit.panic-abort.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.SimplifyLocals-final.after.32bit.panic-unwind.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.SimplifyLocals-final.after.64bit.panic-abort.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.main.SimplifyLocals-final.after.64bit.panic-unwind.mir Remove comments from mir-opt MIR dumps 2023-06-15 15:19:11 -04:00
optimizes_into_variable.rs Use -Zdump-mir-exclude-alloc-bytes in some mir-opt tests 2024-06-26 15:05:01 -07:00
option_bubble_debug.option_direct.PreCodegen.after.panic-abort.mir Add a debug-mode MIR pre-codegen test for ?-on-Option 2025-08-03 17:30:40 -07:00
option_bubble_debug.option_direct.PreCodegen.after.panic-unwind.mir Add a debug-mode MIR pre-codegen test for ?-on-Option 2025-08-03 17:30:40 -07:00
option_bubble_debug.option_traits.PreCodegen.after.panic-abort.mir Add a debug-mode MIR pre-codegen test for ?-on-Option 2025-08-03 17:30:40 -07:00
option_bubble_debug.option_traits.PreCodegen.after.panic-unwind.mir Add a debug-mode MIR pre-codegen test for ?-on-Option 2025-08-03 17:30:40 -07:00
option_bubble_debug.rs Add a debug-mode MIR pre-codegen test for ?-on-Option 2025-08-03 17:30:40 -07:00
ptr_offset.demo_byte_add_fat.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
ptr_offset.demo_byte_add_fat.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
ptr_offset.demo_byte_add_thin.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
ptr_offset.demo_byte_add_thin.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
ptr_offset.rs tests: ignore-debug -> ignore-std-debug-assertions 2024-10-31 17:33:42 +08:00
range_iter.forward_loop.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
range_iter.forward_loop.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
range_iter.inclusive_loop.PreCodegen.after.panic-abort.mir std::range 2025-01-30 20:37:56 -07:00
range_iter.inclusive_loop.PreCodegen.after.panic-unwind.mir std::range 2025-01-30 20:37:56 -07:00
range_iter.range_inclusive_iter_next.PreCodegen.after.panic-abort.mir std::range 2025-01-30 20:37:56 -07:00
range_iter.range_inclusive_iter_next.PreCodegen.after.panic-unwind.mir std::range 2025-01-30 20:37:56 -07:00
range_iter.range_iter_next.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
range_iter.range_iter_next.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
range_iter.rs Remove some only- clauses from mir-opt tests 2024-03-18 10:07:43 -04:00
README.md Update SUMMARY.md 2025-07-14 12:01:41 +03:00
simple_option_map.ezmap.PreCodegen.after.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
simple_option_map.map_via_question_mark.PreCodegen.after.mir Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
simple_option_map.rs Add MIR pre-codegen tests to track 138544 2025-03-15 14:13:37 -07:00
slice_filter.rs Ignore less tests in debug builds 2024-02-23 18:04:01 -05:00
slice_filter.variant_a-{closure#0}.PreCodegen.after.mir Propagate from borrowed locals in CopyProp 2025-07-10 09:36:20 +02:00
slice_filter.variant_b-{closure#0}.PreCodegen.after.mir Bless tests 2025-04-02 19:59:26 +08:00
slice_index.rs Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
slice_index.slice_get_mut_usize.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_index.slice_get_mut_usize.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_index.slice_get_unchecked_mut_range.PreCodegen.after.panic-abort.mir slice.get(i) should use a slice projection in MIR, like slice[i] does 2025-05-30 12:04:41 -07:00
slice_index.slice_get_unchecked_mut_range.PreCodegen.after.panic-unwind.mir slice.get(i) should use a slice projection in MIR, like slice[i] does 2025-05-30 12:04:41 -07:00
slice_index.slice_index_range.PreCodegen.after.panic-abort.mir Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
slice_index.slice_index_range.PreCodegen.after.panic-unwind.mir Consolidate panicking functions in slice/index.rs 2025-08-21 11:07:25 +01:00
slice_index.slice_index_usize.PreCodegen.after.panic-abort.mir Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
slice_index.slice_index_usize.PreCodegen.after.panic-unwind.mir Reapply "Auto merge of #133734 - scottmcm:lower-indexing-to-ptrmetadata, r=davidtwco,RalfJung" 2025-01-27 23:42:47 +00:00
slice_index.slice_ptr_get_unchecked_range.PreCodegen.after.panic-abort.mir slice.get(i) should use a slice projection in MIR, like slice[i] does 2025-05-30 12:04:41 -07:00
slice_index.slice_ptr_get_unchecked_range.PreCodegen.after.panic-unwind.mir slice.get(i) should use a slice projection in MIR, like slice[i] does 2025-05-30 12:04:41 -07:00
slice_iter.enumerated_loop.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.enumerated_loop.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.forward_loop.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.forward_loop.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.range_loop.PreCodegen.after.panic-abort.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
slice_iter.range_loop.PreCodegen.after.panic-unwind.mir Add some track_caller info to precondition panics 2025-05-21 09:10:06 -04:00
slice_iter.reverse_loop.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.reverse_loop.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.rs tests: ignore-debug -> ignore-std-debug-assertions 2024-10-31 17:33:42 +08:00
slice_iter.slice_iter_generic_is_empty.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.slice_iter_generic_is_empty.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.slice_iter_mut_next_back.PreCodegen.after.panic-abort.mir Avoid MIR bloat in inlining 2024-07-01 05:17:13 -07:00
slice_iter.slice_iter_mut_next_back.PreCodegen.after.panic-unwind.mir Avoid MIR bloat in inlining 2024-07-01 05:17:13 -07:00
slice_iter.slice_iter_next.PreCodegen.after.panic-abort.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
slice_iter.slice_iter_next.PreCodegen.after.panic-unwind.mir Convert moves of references to copies in RefProp 2025-08-11 23:10:56 -04:00
spans.outer.PreCodegen.after.panic-abort.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
spans.outer.PreCodegen.after.panic-unwind.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
spans.rs At debuginfo=0, don't inline debuginfo when inlining 2024-04-18 09:35:35 -07:00
try_identity.new.PreCodegen.after.mir Bless *all* the mir-opt tests 2024-08-18 16:07:33 -07:00
try_identity.old.PreCodegen.after.mir Remove unsound-mir-opts for simplify_aggregate_to_copy 2025-04-03 21:59:43 +08:00
try_identity.rs rustfmt tests/mir-opt. 2024-06-03 14:17:16 +10:00
tuple_ord.demo_ge_partial.PreCodegen.after.mir Allow GVN to produce places and not just locals. 2025-04-04 10:55:36 +00:00
tuple_ord.demo_le_total.PreCodegen.after.mir Allow GVN to produce places and not just locals. 2025-04-04 10:55:36 +00:00
tuple_ord.rs Add chaining versions of lt/le/gt/ge and use them in tuple PartialOrd 2025-03-19 09:27:02 -07:00
vec_deref.rs Add a MIR pre-codegen test for Vec::deref 2024-04-21 11:08:36 -07:00
vec_deref.vec_deref_to_slice.PreCodegen.after.panic-abort.mir intrinsics: rename min_align_of to align_of 2025-06-12 17:50:25 +02:00
vec_deref.vec_deref_to_slice.PreCodegen.after.panic-unwind.mir intrinsics: rename min_align_of to align_of 2025-06-12 17:50:25 +02:00

The goal of this directory is to track the quality of MIR that is given to codegen in a standard -O configuration.

As such, feel free to --bless whatever changes you get here, so long as doing so doesn't add substantially more MIR.