File tree Expand file tree Collapse file tree 8 files changed +58
-54
lines changed Expand file tree Collapse file tree 8 files changed +58
-54
lines changed Original file line number Diff line number Diff line change 11- // MIR for `borrowed` before CopyProp
22+ // MIR for `borrowed` after CopyProp
33
4- fn borrowed(_1: u32 ) -> bool {
4+ fn borrowed(_1: T ) -> bool {
55 let mut _0: bool;
6- let mut _2: u32 ;
7- let mut _3: &u32 ;
6+ let mut _2: T ;
7+ let mut _3: &T ;
88
99 bb0: {
1010- _2 = _1;
1111 _3 = &_1;
12- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind unreachable];
12+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind unreachable];
1313 }
1414
1515 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];
1818 }
1919
2020 bb2: {
Original file line number Diff line number Diff line change 11- // MIR for `borrowed` before CopyProp
22+ // MIR for `borrowed` after CopyProp
33
4- fn borrowed(_1: u32 ) -> bool {
4+ fn borrowed(_1: T ) -> bool {
55 let mut _0: bool;
6- let mut _2: u32 ;
7- let mut _3: &u32 ;
6+ let mut _2: T ;
7+ let mut _3: &T ;
88
99 bb0: {
1010- _2 = _1;
1111 _3 = &_1;
12- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind continue];
12+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind continue];
1313 }
1414
1515 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];
1818 }
1919
2020 bb2: {
Original file line number Diff line number Diff line change 11// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
22//@ unit-test: CopyProp
33
4- #![ feature( custom_mir, core_intrinsics) ]
4+ #![ feature( custom_mir, core_intrinsics, freeze ) ]
55#![ allow( unused_assignments) ]
66extern crate core;
7+ use core:: marker:: Freeze ;
78use core:: intrinsics:: mir:: * ;
89
910fn opaque ( _: impl Sized ) -> bool { true }
@@ -42,14 +43,15 @@ fn compare_address() -> bool {
4243 )
4344}
4445
46+ /// Generic type `T` is `Freeze`, so shared borrows are immutable.
4547#[ custom_mir( dialect = "analysis" , phase = "post-cleanup" ) ]
46- fn borrowed ( x : u32 ) -> bool {
48+ fn borrowed < T : Copy + Freeze > ( x : T ) -> bool {
4749 // CHECK-LABEL: fn borrowed(
4850 // CHECK: bb0: {
4951 // CHECK-NEXT: _3 = &_1;
50- // CHECK-NEXT: _0 = opaque::<&u32 >(_3)
52+ // CHECK-NEXT: _0 = opaque::<&T >(_3)
5153 // CHECK: bb1: {
52- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
54+ // CHECK-NEXT: _0 = opaque::<T >(_1)
5355 mir ! (
5456 {
5557 let a = x;
Original file line number Diff line number Diff line change 11- // MIR for `borrowed` before GVN
22+ // MIR for `borrowed` after GVN
33
4- fn borrowed(_1: u32 ) -> () {
4+ fn borrowed(_1: T ) -> () {
55 let mut _0: ();
6- let mut _2: u32 ;
7- let mut _3: &u32 ;
6+ let mut _2: T ;
7+ let mut _3: &T ;
88
99 bb0: {
1010 _2 = _1;
1111 _3 = &_1;
12- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind unreachable];
12+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind unreachable];
1313 }
1414
1515 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];
1818 }
1919
2020 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];
2323 }
2424
2525 bb3: {
Original file line number Diff line number Diff line change 11- // MIR for `borrowed` before GVN
22+ // MIR for `borrowed` after GVN
33
4- fn borrowed(_1: u32 ) -> () {
4+ fn borrowed(_1: T ) -> () {
55 let mut _0: ();
6- let mut _2: u32 ;
7- let mut _3: &u32 ;
6+ let mut _2: T ;
7+ let mut _3: &T ;
88
99 bb0: {
1010 _2 = _1;
1111 _3 = &_1;
12- _0 = opaque::<&u32 >(_3) -> [return: bb1, unwind continue];
12+ _0 = opaque::<&T >(_3) -> [return: bb1, unwind continue];
1313 }
1414
1515 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];
1818 }
1919
2020 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];
2323 }
2424
2525 bb3: {
Original file line number Diff line number Diff line change 88 let mut _3: fn(u8) -> u8;
99 let _5: ();
1010 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};
1212 let _10: ();
1313 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};
1515 let _14: ();
1616 let mut _15: fn();
1717 scope 1 {
1818 debug f => _1;
1919 let _4: fn(u8) -> u8;
2020 scope 2 {
2121 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};
2323 scope 3 {
2424 debug closure => _7;
2525 let _8: fn();
6262 StorageDead(_6);
6363 StorageDead(_5);
6464- StorageLive(_7);
65- - _7 = {closure@$DIR/gvn.rs:610 :19: 610 :21};
65+ - _7 = {closure@$DIR/gvn.rs:612 :19: 612 :21};
6666- StorageLive(_8);
6767+ 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};
6969+ nop;
7070 StorageLive(_9);
7171- _9 = _7;
7272- _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)));
7575 StorageDead(_9);
7676 StorageLive(_10);
7777 StorageLive(_11);
8888 StorageLive(_13);
8989- _13 = _7;
9090- _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)));
9393 StorageDead(_13);
9494 StorageLive(_14);
9595 StorageLive(_15);
Original file line number Diff line number Diff line change 88 let mut _3: fn(u8) -> u8;
99 let _5: ();
1010 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};
1212 let _10: ();
1313 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};
1515 let _14: ();
1616 let mut _15: fn();
1717 scope 1 {
1818 debug f => _1;
1919 let _4: fn(u8) -> u8;
2020 scope 2 {
2121 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};
2323 scope 3 {
2424 debug closure => _7;
2525 let _8: fn();
6262 StorageDead(_6);
6363 StorageDead(_5);
6464- StorageLive(_7);
65- - _7 = {closure@$DIR/gvn.rs:610 :19: 610 :21};
65+ - _7 = {closure@$DIR/gvn.rs:612 :19: 612 :21};
6666- StorageLive(_8);
6767+ 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};
6969+ nop;
7070 StorageLive(_9);
7171- _9 = _7;
7272- _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)));
7575 StorageDead(_9);
7676 StorageLive(_10);
7777 StorageLive(_11);
8888 StorageLive(_13);
8989- _13 = _7;
9090- _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)));
9393 StorageDead(_13);
9494 StorageLive(_14);
9595 StorageLive(_15);
Original file line number Diff line number Diff line change 66#![ feature( rustc_attrs) ]
77#![ feature( custom_mir) ]
88#![ feature( core_intrinsics) ]
9+ #![ feature( freeze) ]
910#![ allow( unconditional_panic) ]
1011
1112use std:: intrinsics:: mir:: * ;
13+ use std:: marker:: Freeze ;
1214use std:: mem:: transmute;
1315
1416struct S < T > ( T ) ;
@@ -721,16 +723,16 @@ fn wide_ptr_integer() {
721723}
722724
723725#[ custom_mir( dialect = "analysis" , phase = "post-cleanup" ) ]
724- fn borrowed ( x : u32 ) {
726+ fn borrowed < T : Copy + Freeze > ( x : T ) {
725727 // CHECK-LABEL: fn borrowed(
726728 // CHECK: bb0: {
727729 // CHECK-NEXT: _2 = _1;
728730 // CHECK-NEXT: _3 = &_1;
729- // CHECK-NEXT: _0 = opaque::<&u32 >(_3)
731+ // CHECK-NEXT: _0 = opaque::<&T >(_3)
730732 // CHECK: bb1: {
731- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
733+ // CHECK-NEXT: _0 = opaque::<T >(_1)
732734 // CHECK: bb2: {
733- // CHECK-NEXT: _0 = opaque::<u32 >(_1)
735+ // CHECK-NEXT: _0 = opaque::<T >(_1)
734736 mir ! (
735737 {
736738 let a = x;
You can’t perform that action at this time.
0 commit comments