| // This example is interesting because the non-transitive version of `MaybeLiveLocals` would |
| // report that *all* of these stores are live. |
| // |
| //@ needs-unwind |
| //@ test-mir-pass: DeadStoreElimination-initial |
| |
| #![feature(core_intrinsics, custom_mir)] |
| use std::intrinsics::mir::*; |
| |
| #[inline(never)] |
| fn cond() -> bool { |
| false |
| } |
| |
| // EMIT_MIR cycle.cycle.DeadStoreElimination-initial.diff |
| #[custom_mir(dialect = "runtime", phase = "post-cleanup")] |
| fn cycle(mut x: i32, mut y: i32, mut z: i32) { |
| // CHECK-LABEL: fn cycle( |
| // CHECK-NOT: {{_.*}} = {{_.*}}; |
| // CHECK-NOT: {{_.*}} = move {{_.*}}; |
| |
| // We use custom MIR to avoid generating debuginfo, that would force to preserve writes. |
| mir! { |
| let condition: bool; |
| { |
| Call(condition = cond(), ReturnTo(bb1), UnwindContinue()) |
| } |
| bb1 = { |
| match condition { true => bb2, _ => ret } |
| } |
| bb2 = { |
| let temp = z; |
| z = y; |
| y = x; |
| x = temp; |
| Call(condition = cond(), ReturnTo(bb1), UnwindContinue()) |
| } |
| ret = { |
| Return() |
| } |
| } |
| } |
| |
| fn main() { |
| cycle(1, 2, 3); |
| } |