File tree 8 files changed +58
-54
lines changed
8 files changed +58
-54
lines changed Original file line number Diff line number Diff line change 1
1
- // MIR for `borrowed` before CopyProp
2
2
+ // MIR for `borrowed` after CopyProp
3
3
4
- fn borrowed(_1: u32 ) -> bool {
4
+ fn borrowed(_1: T ) -> bool {
5
5
let mut _0: bool;
6
- let mut _2: u32 ;
7
- let mut _3: &u32 ;
6
+ let mut _2: T ;
7
+ let mut _3: &T ;
8
8
9
9
bb0: {
10
10
- _2 = _1;
11
11
_3 = &_1;
12
- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind unreachable];
12
+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind unreachable];
13
13
}
14
14
15
15
bb1: {
16
- - _0 = opaque::<u32 >(_2) -> [return: bb2, unwind unreachable];
17
- + _0 = opaque::<u32 >(_1) -> [return: bb2, unwind unreachable];
16
+ - _0 = opaque::<T >(_2) -> [return: bb2, unwind unreachable];
17
+ + _0 = opaque::<T >(_1) -> [return: bb2, unwind unreachable];
18
18
}
19
19
20
20
bb2: {
Original file line number Diff line number Diff line change 1
1
- // MIR for `borrowed` before CopyProp
2
2
+ // MIR for `borrowed` after CopyProp
3
3
4
- fn borrowed(_1: u32 ) -> bool {
4
+ fn borrowed(_1: T ) -> bool {
5
5
let mut _0: bool;
6
- let mut _2: u32 ;
7
- let mut _3: &u32 ;
6
+ let mut _2: T ;
7
+ let mut _3: &T ;
8
8
9
9
bb0: {
10
10
- _2 = _1;
11
11
_3 = &_1;
12
- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind continue];
12
+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind continue];
13
13
}
14
14
15
15
bb1: {
16
- - _0 = opaque::<u32 >(_2) -> [return: bb2, unwind continue];
17
- + _0 = opaque::<u32 >(_1) -> [return: bb2, unwind continue];
16
+ - _0 = opaque::<T >(_2) -> [return: bb2, unwind continue];
17
+ + _0 = opaque::<T >(_1) -> [return: bb2, unwind continue];
18
18
}
19
19
20
20
bb2: {
Original file line number Diff line number Diff line change 1
1
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
2
2
//@ unit-test: CopyProp
3
3
4
- #![ feature( custom_mir, core_intrinsics) ]
4
+ #![ feature( custom_mir, core_intrinsics, freeze ) ]
5
5
#![ allow( unused_assignments) ]
6
6
extern crate core;
7
+ use core:: marker:: Freeze ;
7
8
use core:: intrinsics:: mir:: * ;
8
9
9
10
fn opaque ( _: impl Sized ) -> bool { true }
@@ -42,14 +43,15 @@ fn compare_address() -> bool {
42
43
)
43
44
}
44
45
46
+ /// Generic type `T` is `Freeze`, so shared borrows are immutable.
45
47
#[ custom_mir( dialect = "analysis" , phase = "post-cleanup" ) ]
46
- fn borrowed ( x : u32 ) -> bool {
48
+ fn borrowed < T : Copy + Freeze > ( x : T ) -> bool {
47
49
// CHECK-LABEL: fn borrowed(
48
50
// CHECK: bb0: {
49
51
// CHECK-NEXT: _3 = &_1;
50
- // CHECK-NEXT: _0 = opaque::<&u32 >(_3)
52
+ // CHECK-NEXT: _0 = opaque::<&T >(_3)
51
53
// CHECK: bb1: {
52
- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
54
+ // CHECK-NEXT: _0 = opaque::<T >(_1)
53
55
mir ! (
54
56
{
55
57
let a = x;
Original file line number Diff line number Diff line change 1
1
- // MIR for `borrowed` before GVN
2
2
+ // MIR for `borrowed` after GVN
3
3
4
- fn borrowed(_1: u32 ) -> () {
4
+ fn borrowed(_1: T ) -> () {
5
5
let mut _0: ();
6
- let mut _2: u32 ;
7
- let mut _3: &u32 ;
6
+ let mut _2: T ;
7
+ let mut _3: &T ;
8
8
9
9
bb0: {
10
10
_2 = _1;
11
11
_3 = &_1;
12
- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind unreachable];
12
+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind unreachable];
13
13
}
14
14
15
15
bb1: {
16
- - _0 = opaque::<u32 >(_2) -> [return: bb2, unwind unreachable];
17
- + _0 = opaque::<u32 >(_1) -> [return: bb2, unwind unreachable];
16
+ - _0 = opaque::<T >(_2) -> [return: bb2, unwind unreachable];
17
+ + _0 = opaque::<T >(_1) -> [return: bb2, unwind unreachable];
18
18
}
19
19
20
20
bb2: {
21
- - _0 = opaque::<u32 >((*_3)) -> [return: bb3, unwind unreachable];
22
- + _0 = opaque::<u32 >(_1) -> [return: bb3, unwind unreachable];
21
+ - _0 = opaque::<T >((*_3)) -> [return: bb3, unwind unreachable];
22
+ + _0 = opaque::<T >(_1) -> [return: bb3, unwind unreachable];
23
23
}
24
24
25
25
bb3: {
Original file line number Diff line number Diff line change 1
1
- // MIR for `borrowed` before GVN
2
2
+ // MIR for `borrowed` after GVN
3
3
4
- fn borrowed(_1: u32 ) -> () {
4
+ fn borrowed(_1: T ) -> () {
5
5
let mut _0: ();
6
- let mut _2: u32 ;
7
- let mut _3: &u32 ;
6
+ let mut _2: T ;
7
+ let mut _3: &T ;
8
8
9
9
bb0: {
10
10
_2 = _1;
11
11
_3 = &_1;
12
- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind continue];
12
+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind continue];
13
13
}
14
14
15
15
bb1: {
16
- - _0 = opaque::<u32 >(_2) -> [return: bb2, unwind continue];
17
- + _0 = opaque::<u32 >(_1) -> [return: bb2, unwind continue];
16
+ - _0 = opaque::<T >(_2) -> [return: bb2, unwind continue];
17
+ + _0 = opaque::<T >(_1) -> [return: bb2, unwind continue];
18
18
}
19
19
20
20
bb2: {
21
- - _0 = opaque::<u32 >((*_3)) -> [return: bb3, unwind continue];
22
- + _0 = opaque::<u32 >(_1) -> [return: bb3, unwind continue];
21
+ - _0 = opaque::<T >((*_3)) -> [return: bb3, unwind continue];
22
+ + _0 = opaque::<T >(_1) -> [return: bb3, unwind continue];
23
23
}
24
24
25
25
bb3: {
Original file line number Diff line number Diff line change 8
8
let mut _3: fn(u8) -> u8;
9
9
let _5: ();
10
10
let mut _6: fn(u8) -> u8;
11
- let mut _9: {closure@$DIR/gvn.rs:610 :19: 610 :21};
11
+ let mut _9: {closure@$DIR/gvn.rs:612 :19: 612 :21};
12
12
let _10: ();
13
13
let mut _11: fn();
14
- let mut _13: {closure@$DIR/gvn.rs:610 :19: 610 :21};
14
+ let mut _13: {closure@$DIR/gvn.rs:612 :19: 612 :21};
15
15
let _14: ();
16
16
let mut _15: fn();
17
17
scope 1 {
18
18
debug f => _1;
19
19
let _4: fn(u8) -> u8;
20
20
scope 2 {
21
21
debug g => _4;
22
- let _7: {closure@$DIR/gvn.rs:610 :19: 610 :21};
22
+ let _7: {closure@$DIR/gvn.rs:612 :19: 612 :21};
23
23
scope 3 {
24
24
debug closure => _7;
25
25
let _8: fn();
62
62
StorageDead(_6);
63
63
StorageDead(_5);
64
64
- StorageLive(_7);
65
- - _7 = {closure@$DIR/gvn.rs:610 :19: 610 :21};
65
+ - _7 = {closure@$DIR/gvn.rs:612 :19: 612 :21};
66
66
- StorageLive(_8);
67
67
+ nop;
68
- + _7 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
68
+ + _7 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
69
69
+ nop;
70
70
StorageLive(_9);
71
71
- _9 = _7;
72
72
- _8 = move _9 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
73
- + _9 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
74
- + _8 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
73
+ + _9 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
74
+ + _8 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
75
75
StorageDead(_9);
76
76
StorageLive(_10);
77
77
StorageLive(_11);
88
88
StorageLive(_13);
89
89
- _13 = _7;
90
90
- _12 = move _13 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
91
- + _13 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
92
- + _12 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
91
+ + _13 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
92
+ + _12 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
93
93
StorageDead(_13);
94
94
StorageLive(_14);
95
95
StorageLive(_15);
Original file line number Diff line number Diff line change 8
8
let mut _3: fn(u8) -> u8;
9
9
let _5: ();
10
10
let mut _6: fn(u8) -> u8;
11
- let mut _9: {closure@$DIR/gvn.rs:610 :19: 610 :21};
11
+ let mut _9: {closure@$DIR/gvn.rs:612 :19: 612 :21};
12
12
let _10: ();
13
13
let mut _11: fn();
14
- let mut _13: {closure@$DIR/gvn.rs:610 :19: 610 :21};
14
+ let mut _13: {closure@$DIR/gvn.rs:612 :19: 612 :21};
15
15
let _14: ();
16
16
let mut _15: fn();
17
17
scope 1 {
18
18
debug f => _1;
19
19
let _4: fn(u8) -> u8;
20
20
scope 2 {
21
21
debug g => _4;
22
- let _7: {closure@$DIR/gvn.rs:610 :19: 610 :21};
22
+ let _7: {closure@$DIR/gvn.rs:612 :19: 612 :21};
23
23
scope 3 {
24
24
debug closure => _7;
25
25
let _8: fn();
62
62
StorageDead(_6);
63
63
StorageDead(_5);
64
64
- StorageLive(_7);
65
- - _7 = {closure@$DIR/gvn.rs:610 :19: 610 :21};
65
+ - _7 = {closure@$DIR/gvn.rs:612 :19: 612 :21};
66
66
- StorageLive(_8);
67
67
+ nop;
68
- + _7 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
68
+ + _7 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
69
69
+ nop;
70
70
StorageLive(_9);
71
71
- _9 = _7;
72
72
- _8 = move _9 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
73
- + _9 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
74
- + _8 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
73
+ + _9 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
74
+ + _8 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
75
75
StorageDead(_9);
76
76
StorageLive(_10);
77
77
StorageLive(_11);
88
88
StorageLive(_13);
89
89
- _13 = _7;
90
90
- _12 = move _13 as fn() (PointerCoercion(ClosureFnPointer(Normal)));
91
- + _13 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21};
92
- + _12 = const ZeroSized: {closure@$DIR/gvn.rs:610 :19: 610 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
91
+ + _13 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21};
92
+ + _12 = const ZeroSized: {closure@$DIR/gvn.rs:612 :19: 612 :21} as fn() (PointerCoercion(ClosureFnPointer(Normal)));
93
93
StorageDead(_13);
94
94
StorageLive(_14);
95
95
StorageLive(_15);
Original file line number Diff line number Diff line change 6
6
#![ feature( rustc_attrs) ]
7
7
#![ feature( custom_mir) ]
8
8
#![ feature( core_intrinsics) ]
9
+ #![ feature( freeze) ]
9
10
#![ allow( unconditional_panic) ]
10
11
11
12
use std:: intrinsics:: mir:: * ;
13
+ use std:: marker:: Freeze ;
12
14
use std:: mem:: transmute;
13
15
14
16
struct S < T > ( T ) ;
@@ -721,16 +723,16 @@ fn wide_ptr_integer() {
721
723
}
722
724
723
725
#[ custom_mir( dialect = "analysis" , phase = "post-cleanup" ) ]
724
- fn borrowed ( x : u32 ) {
726
+ fn borrowed < T : Copy + Freeze > ( x : T ) {
725
727
// CHECK-LABEL: fn borrowed(
726
728
// CHECK: bb0: {
727
729
// CHECK-NEXT: _2 = _1;
728
730
// CHECK-NEXT: _3 = &_1;
729
- // CHECK-NEXT: _0 = opaque::<&u32 >(_3)
731
+ // CHECK-NEXT: _0 = opaque::<&T >(_3)
730
732
// CHECK: bb1: {
731
- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
733
+ // CHECK-NEXT: _0 = opaque::<T >(_1)
732
734
// CHECK: bb2: {
733
- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
735
+ // CHECK-NEXT: _0 = opaque::<T >(_1)
734
736
mir ! (
735
737
{
736
738
let a = x;
You can’t perform that action at this time.
0 commit comments