Skip to content

Commit 9c3c908

Browse files
committed
Add tests.
1 parent fc1a4c5 commit 9c3c908

12 files changed

+333
-10
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `borrowed` before CopyProp
2+
+ // MIR for `borrowed` after CopyProp
3+
4+
fn borrowed(_1: u32) -> bool {
5+
let mut _0: bool;
6+
let mut _2: u32;
7+
let mut _3: &u32;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&u32>(_3) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<u32>(_2) -> [return: bb2, unwind unreachable];
17+
}
18+
19+
bb2: {
20+
return;
21+
}
22+
}
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `borrowed` before CopyProp
2+
+ // MIR for `borrowed` after CopyProp
3+
4+
fn borrowed(_1: u32) -> bool {
5+
let mut _0: bool;
6+
let mut _2: u32;
7+
let mut _3: &u32;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&u32>(_3) -> [return: bb1, unwind continue];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<u32>(_2) -> [return: bb2, unwind continue];
17+
}
18+
19+
bb2: {
20+
return;
21+
}
22+
}
23+

tests/mir-opt/copy-prop/borrowed_local.f.CopyProp.panic-abort.diff renamed to tests/mir-opt/copy-prop/borrowed_local.compare_address.CopyProp.panic-abort.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
- // MIR for `f` before CopyProp
2-
+ // MIR for `f` after CopyProp
1+
- // MIR for `compare_address` before CopyProp
2+
+ // MIR for `compare_address` after CopyProp
33

4-
fn f() -> bool {
4+
fn compare_address() -> bool {
55
let mut _0: bool;
66
let mut _1: u8;
77
let mut _2: &u8;

tests/mir-opt/copy-prop/borrowed_local.f.CopyProp.panic-unwind.diff renamed to tests/mir-opt/copy-prop/borrowed_local.compare_address.CopyProp.panic-unwind.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
- // MIR for `f` before CopyProp
2-
+ // MIR for `f` after CopyProp
1+
- // MIR for `compare_address` before CopyProp
2+
+ // MIR for `compare_address` after CopyProp
33

4-
fn f() -> bool {
4+
fn compare_address() -> bool {
55
let mut _0: bool;
66
let mut _1: u8;
77
let mut _2: &u8;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `non_freeze` before CopyProp
2+
+ // MIR for `non_freeze` after CopyProp
3+
4+
fn non_freeze(_1: T) -> bool {
5+
let mut _0: bool;
6+
let mut _2: T;
7+
let mut _3: &T;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&T>(_3) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<T>(_2) -> [return: bb2, unwind unreachable];
17+
}
18+
19+
bb2: {
20+
return;
21+
}
22+
}
23+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
- // MIR for `non_freeze` before CopyProp
2+
+ // MIR for `non_freeze` after CopyProp
3+
4+
fn non_freeze(_1: T) -> bool {
5+
let mut _0: bool;
6+
let mut _2: T;
7+
let mut _3: &T;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&T>(_3) -> [return: bb1, unwind continue];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<T>(_2) -> [return: bb2, unwind continue];
17+
}
18+
19+
bb2: {
20+
return;
21+
}
22+
}
23+

tests/mir-opt/copy-prop/borrowed_local.rs

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// skip-filecheck
21
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
32
//@ unit-test: CopyProp
43

@@ -14,7 +13,16 @@ fn cmp_ref(a: &u8, b: &u8) -> bool {
1413
}
1514

1615
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
17-
fn f() -> bool {
16+
fn compare_address() -> bool {
17+
// CHECK-LABEL: fn compare_address(
18+
// CHECK: bb0: {
19+
// CHECK-NEXT: _1 = const 5_u8;
20+
// CHECK-NEXT: _2 = &_1;
21+
// CHECK-NEXT: _3 = _1;
22+
// CHECK-NEXT: _4 = &_3;
23+
// CHECK-NEXT: _0 = cmp_ref(_2, _4)
24+
// CHECK: bb1: {
25+
// CHECK-NEXT: _0 = opaque::<u8>(_3)
1826
mir!(
1927
{
2028
let a = 5_u8;
@@ -34,8 +42,60 @@ fn f() -> bool {
3442
)
3543
}
3644

45+
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
46+
fn borrowed(x: u32) -> bool {
47+
// CHECK-LABEL: fn borrowed(
48+
// CHECK: bb0: {
49+
// CHECK-NEXT: _2 = _1;
50+
// CHECK-NEXT: _3 = &_1;
51+
// CHECK-NEXT: _0 = opaque::<&u32>(_3)
52+
// CHECK: bb1: {
53+
// CHECK-NEXT: _0 = opaque::<u32>(_2)
54+
mir!(
55+
{
56+
let a = x;
57+
let r1 = &x;
58+
Call(RET = opaque(r1), ReturnTo(next), UnwindContinue())
59+
}
60+
next = {
61+
Call(RET = opaque(a), ReturnTo(ret), UnwindContinue())
62+
}
63+
ret = {
64+
Return()
65+
}
66+
)
67+
}
68+
69+
/// Generic type `T` is not known to be `Freeze`, so shared borrows may be mutable.
70+
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
71+
fn non_freeze<T: Copy>(x: T) -> bool {
72+
// CHECK-LABEL: fn non_freeze(
73+
// CHECK: bb0: {
74+
// CHECK-NEXT: _2 = _1;
75+
// CHECK-NEXT: _3 = &_1;
76+
// CHECK-NEXT: _0 = opaque::<&T>(_3)
77+
// CHECK: bb1: {
78+
// CHECK-NEXT: _0 = opaque::<T>(_2)
79+
mir!(
80+
{
81+
let a = x;
82+
let r1 = &x;
83+
Call(RET = opaque(r1), ReturnTo(next), UnwindContinue())
84+
}
85+
next = {
86+
Call(RET = opaque(a), ReturnTo(ret), UnwindContinue())
87+
}
88+
ret = {
89+
Return()
90+
}
91+
)
92+
}
93+
3794
fn main() {
38-
assert!(!f());
95+
assert!(!compare_address());
96+
non_freeze(5);
3997
}
4098

41-
// EMIT_MIR borrowed_local.f.CopyProp.diff
99+
// EMIT_MIR borrowed_local.compare_address.CopyProp.diff
100+
// EMIT_MIR borrowed_local.borrowed.CopyProp.diff
101+
// EMIT_MIR borrowed_local.non_freeze.CopyProp.diff
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
- // MIR for `borrowed` before GVN
2+
+ // MIR for `borrowed` after GVN
3+
4+
fn borrowed(_1: u32) -> () {
5+
let mut _0: ();
6+
let mut _2: u32;
7+
let mut _3: &u32;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&u32>(_3) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<u32>(_2) -> [return: bb2, unwind unreachable];
17+
}
18+
19+
bb2: {
20+
_0 = opaque::<u32>((*_3)) -> [return: bb3, unwind unreachable];
21+
}
22+
23+
bb3: {
24+
return;
25+
}
26+
}
27+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
- // MIR for `borrowed` before GVN
2+
+ // MIR for `borrowed` after GVN
3+
4+
fn borrowed(_1: u32) -> () {
5+
let mut _0: ();
6+
let mut _2: u32;
7+
let mut _3: &u32;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&u32>(_3) -> [return: bb1, unwind continue];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<u32>(_2) -> [return: bb2, unwind continue];
17+
}
18+
19+
bb2: {
20+
_0 = opaque::<u32>((*_3)) -> [return: bb3, unwind continue];
21+
}
22+
23+
bb3: {
24+
return;
25+
}
26+
}
27+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
- // MIR for `non_freeze` before GVN
2+
+ // MIR for `non_freeze` after GVN
3+
4+
fn non_freeze(_1: T) -> () {
5+
let mut _0: ();
6+
let mut _2: T;
7+
let mut _3: &T;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&T>(_3) -> [return: bb1, unwind unreachable];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<T>(_2) -> [return: bb2, unwind unreachable];
17+
}
18+
19+
bb2: {
20+
_0 = opaque::<T>((*_3)) -> [return: bb3, unwind unreachable];
21+
}
22+
23+
bb3: {
24+
return;
25+
}
26+
}
27+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
- // MIR for `non_freeze` before GVN
2+
+ // MIR for `non_freeze` after GVN
3+
4+
fn non_freeze(_1: T) -> () {
5+
let mut _0: ();
6+
let mut _2: T;
7+
let mut _3: &T;
8+
9+
bb0: {
10+
_2 = _1;
11+
_3 = &_1;
12+
_0 = opaque::<&T>(_3) -> [return: bb1, unwind continue];
13+
}
14+
15+
bb1: {
16+
_0 = opaque::<T>(_2) -> [return: bb2, unwind continue];
17+
}
18+
19+
bb2: {
20+
_0 = opaque::<T>((*_3)) -> [return: bb3, unwind continue];
21+
}
22+
23+
bb3: {
24+
return;
25+
}
26+
}
27+

tests/mir-opt/gvn.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,65 @@ fn wide_ptr_integer() {
720720
opaque(a >= b);
721721
}
722722

723+
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
724+
fn borrowed(x: u32) {
725+
// CHECK-LABEL: fn borrowed(
726+
// CHECK: bb0: {
727+
// CHECK-NEXT: _2 = _1;
728+
// CHECK-NEXT: _3 = &_1;
729+
// CHECK-NEXT: _0 = opaque::<&u32>(_3)
730+
// CHECK: bb1: {
731+
// CHECK-NEXT: _0 = opaque::<u32>(_2)
732+
// CHECK: bb2: {
733+
// CHECK-NEXT: _0 = opaque::<u32>((*_3))
734+
mir!(
735+
{
736+
let a = x;
737+
let r1 = &x;
738+
Call(RET = opaque(r1), ReturnTo(next), UnwindContinue())
739+
}
740+
next = {
741+
Call(RET = opaque(a), ReturnTo(deref), UnwindContinue())
742+
}
743+
deref = {
744+
Call(RET = opaque(*r1), ReturnTo(ret), UnwindContinue())
745+
}
746+
ret = {
747+
Return()
748+
}
749+
)
750+
}
751+
752+
/// Generic type `T` is not known to be `Freeze`, so shared borrows may be mutable.
753+
#[custom_mir(dialect = "analysis", phase = "post-cleanup")]
754+
fn non_freeze<T: Copy>(x: T) {
755+
// CHECK-LABEL: fn non_freeze(
756+
// CHECK: bb0: {
757+
// CHECK-NEXT: _2 = _1;
758+
// CHECK-NEXT: _3 = &_1;
759+
// CHECK-NEXT: _0 = opaque::<&T>(_3)
760+
// CHECK: bb1: {
761+
// CHECK-NEXT: _0 = opaque::<T>(_2)
762+
// CHECK: bb2: {
763+
// CHECK-NEXT: _0 = opaque::<T>((*_3))
764+
mir!(
765+
{
766+
let a = x;
767+
let r1 = &x;
768+
Call(RET = opaque(r1), ReturnTo(next), UnwindContinue())
769+
}
770+
next = {
771+
Call(RET = opaque(a), ReturnTo(deref), UnwindContinue())
772+
}
773+
deref = {
774+
Call(RET = opaque(*r1), ReturnTo(ret), UnwindContinue())
775+
}
776+
ret = {
777+
Return()
778+
}
779+
)
780+
}
781+
723782
fn main() {
724783
subexpression_elimination(2, 4, 5);
725784
wrap_unwrap(5);
@@ -742,6 +801,8 @@ fn main() {
742801
constant_index_overflow(&[5, 3]);
743802
wide_ptr_provenance();
744803
wide_ptr_integer();
804+
borrowed(5);
805+
non_freeze(5);
745806
}
746807

747808
#[inline(never)]
@@ -773,3 +834,5 @@ fn identity<T>(x: T) -> T {
773834
// EMIT_MIR gvn.wide_ptr_provenance.GVN.diff
774835
// EMIT_MIR gvn.wide_ptr_same_provenance.GVN.diff
775836
// EMIT_MIR gvn.wide_ptr_integer.GVN.diff
837+
// EMIT_MIR gvn.borrowed.GVN.diff
838+
// EMIT_MIR gvn.non_freeze.GVN.diff

0 commit comments

Comments
 (0)