Skip to content

Commit 8a5d883

Browse files
committed
Added a failing test
1 parent ded6d7d commit 8a5d883

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- // MIR for `dead_twice` before CopyProp
2+
+ // MIR for `dead_twice` after CopyProp
3+
4+
fn dead_twice(_1: T) -> T {
5+
let mut _0: T;
6+
let mut _2: T;
7+
let mut _3: T;
8+
let mut _4: T;
9+
10+
bb0: {
11+
- StorageLive(_2);
12+
_2 = opaque::<T>(move _1) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
- _4 = move _2;
17+
- StorageDead(_2);
18+
- StorageLive(_2);
19+
- _0 = opaque::<T>(move _4) -> [return: bb2, unwind unreachable];
20+
+ _0 = opaque::<T>(move _2) -> [return: bb2, unwind unreachable];
21+
}
22+
23+
bb2: {
24+
- StorageDead(_2);
25+
return;
26+
}
27+
}
28+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
- // MIR for `dead_twice` before CopyProp
2+
+ // MIR for `dead_twice` after CopyProp
3+
4+
fn dead_twice(_1: T) -> T {
5+
let mut _0: T;
6+
let mut _2: T;
7+
let mut _3: T;
8+
let mut _4: T;
9+
10+
bb0: {
11+
- StorageLive(_2);
12+
_2 = opaque::<T>(move _1) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
- _4 = move _2;
17+
- StorageDead(_2);
18+
- StorageLive(_2);
19+
- _0 = opaque::<T>(move _4) -> [return: bb2, unwind unreachable];
20+
+ _0 = opaque::<T>(move _2) -> [return: bb2, unwind unreachable];
21+
}
22+
23+
bb2: {
24+
- StorageDead(_2);
25+
return;
26+
}
27+
}
28+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// skip-filecheck
2+
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
3+
//@ test-mir-pass: CopyProp
4+
5+
#![feature(custom_mir, core_intrinsics)]
6+
7+
// Check that we do not introduce out-of-bounds access.
8+
9+
use std::intrinsics::mir::*;
10+
11+
// EMIT_MIR copy_prop_storage_dead_twice.dead_twice.CopyProp.diff
12+
#[custom_mir(dialect = "runtime")]
13+
pub fn dead_twice<T: Copy>(_1: T) -> T {
14+
mir! {
15+
let _2: T;
16+
let _3: T;
17+
{
18+
StorageLive(_2);
19+
Call(_2 = opaque(Move(_1)), ReturnTo(bb1), UnwindUnreachable())
20+
}
21+
bb1 = {
22+
let _3 = Move(_2);
23+
StorageDead(_2);
24+
StorageLive(_2);
25+
Call(RET = opaque(Move(_3)), ReturnTo(bb2), UnwindUnreachable())
26+
}
27+
bb2 = {
28+
StorageDead(_2);
29+
Return()
30+
}
31+
}
32+
}
33+
34+
#[inline(never)]
35+
fn opaque<T>(a: T) -> T {
36+
a
37+
}

0 commit comments

Comments
 (0)