| // EMIT_MIR_FOR_EACH_PANIC_STRATEGY |
| //@ unit-test: DeadStoreElimination-final |
| //@ compile-flags: -Zmir-enable-passes=+CopyProp |
| |
| #![feature(core_intrinsics)] |
| #![feature(custom_mir)] |
| #![allow(internal_features)] |
| |
| use std::intrinsics::mir::*; |
| |
| #[inline(never)] |
| fn use_both(_: i32, _: i32) {} |
| |
| // EMIT_MIR call_arg_copy.move_simple.DeadStoreElimination-final.diff |
| fn move_simple(x: i32) { |
| // CHECK-LABEL: fn move_simple( |
| // CHECK: = use_both(_1, move _1) |
| use_both(x, x); |
| } |
| |
| #[repr(packed)] |
| struct Packed { |
| x: u8, |
| y: i32, |
| } |
| |
| // EMIT_MIR call_arg_copy.move_packed.DeadStoreElimination-final.diff |
| #[custom_mir(dialect = "analysis")] |
| fn move_packed(packed: Packed) { |
| // CHECK-LABEL: fn move_packed( |
| // CHECK: = use_both(const 0_i32, (_1.1: i32)) |
| mir!( |
| { |
| // We have a packed struct, verify that the copy is not turned into a move. |
| Call(RET = use_both(0, packed.y), ReturnTo(ret), UnwindContinue()) |
| } |
| ret = { |
| Return() |
| } |
| ) |
| } |
| |
| fn main() { |
| move_simple(1); |
| move_packed(Packed { x: 0, y: 1 }); |
| } |