File tree Expand file tree Collapse file tree 3 files changed +180
-0
lines changed Expand file tree Collapse file tree 3 files changed +180
-0
lines changed Original file line number Diff line number Diff line change 1+ - // MIR for `loop_deref_mut` before GVN
2+ + // MIR for `loop_deref_mut` after GVN
3+
4+ fn loop_deref_mut(_1: &mut Value) -> Value {
5+ debug val => _1;
6+ let mut _0: Value;
7+ let _2: &Value;
8+ let _3: &Value;
9+ let mut _4: &Value;
10+ let mut _6: !;
11+ let mut _8: isize;
12+ let mut _9: !;
13+ let mut _10: ();
14+ let mut _12: i32;
15+ let _13: ();
16+ let mut _14: bool;
17+ let mut _15: !;
18+ let mut _16: Value;
19+ scope 1 {
20+ debug val_alias => _2;
21+ let mut _5: bool;
22+ scope 2 {
23+ debug stop => _5;
24+ let _7: i32;
25+ scope 3 {
26+ debug v => _7;
27+ let _11: Value;
28+ scope 4 {
29+ debug v => _11;
30+ }
31+ }
32+ }
33+ }
34+
35+ bb0: {
36+ StorageLive(_2);
37+ - StorageLive(_3);
38+ + nop;
39+ StorageLive(_4);
40+ _4 = &(*_1);
41+ _3 = get::<Value>(move _4) -> [return: bb1, unwind unreachable];
42+ }
43+
44+ bb1: {
45+ _2 = &(*_3);
46+ StorageDead(_4);
47+ - StorageDead(_3);
48+ + nop;
49+ StorageLive(_5);
50+ _5 = const false;
51+ - _8 = discriminant((*_2));
52+ + _8 = discriminant((*_3));
53+ switchInt(move _8) -> [0: bb3, otherwise: bb2];
54+ }
55+
56+ bb2: {
57+ unreachable;
58+ }
59+
60+ bb3: {
61+ - StorageLive(_7);
62+ - _7 = copy (((*_2) as V0).0: i32);
63+ + nop;
64+ + _7 = copy (((*_3) as V0).0: i32);
65+ StorageLive(_9);
66+ goto -> bb4;
67+ }
68+
69+ bb4: {
70+ StorageLive(_11);
71+ StorageLive(_12);
72+ _12 = copy _7;
73+ - _11 = Value::V0(move _12);
74+ + _11 = copy (*_3);
75+ StorageDead(_12);
76+ StorageLive(_13);
77+ StorageLive(_14);
78+ _14 = copy _5;
79+ switchInt(move _14) -> [0: bb6, otherwise: bb5];
80+ }
81+
82+ bb5: {
83+ _0 = move _11;
84+ StorageDead(_14);
85+ StorageDead(_13);
86+ StorageDead(_11);
87+ StorageDead(_9);
88+ - StorageDead(_7);
89+ + nop;
90+ StorageDead(_5);
91+ StorageDead(_2);
92+ return;
93+ }
94+
95+ bb6: {
96+ _13 = const ();
97+ StorageDead(_14);
98+ StorageDead(_13);
99+ _5 = const true;
100+ StorageLive(_16);
101+ - _16 = Value::V1;
102+ - (*_1) = move _16;
103+ + _16 = const Value::V1;
104+ + (*_1) = const Value::V1;
105+ StorageDead(_16);
106+ _10 = const ();
107+ StorageDead(_11);
108+ goto -> bb4;
109+ }
110+ + }
111+ +
112+ + ALLOC0 (size: 8, align: 4) {
113+ + 01 00 00 00 __ __ __ __ │ ....░░░░
114+ }
115+
Original file line number Diff line number Diff line change 1+ // skip-filecheck
2+ //@ test-mir-pass: GVN
3+
4+ #![ crate_type = "lib" ]
5+ #![ feature( core_intrinsics, rustc_attrs) ]
6+
7+ pub enum Value {
8+ V0 ( i32 ) ,
9+ V1 ,
10+ }
11+
12+ // EMIT_MIR gvn_loop.loop_deref_mut.GVN.diff
13+ fn loop_deref_mut ( val : & mut Value ) -> Value {
14+ let val_alias: & Value = get ( val) ;
15+ let mut stop = false ;
16+ let Value :: V0 ( v) = * val_alias else { unsafe { core:: intrinsics:: unreachable ( ) } } ;
17+ loop {
18+ let v = Value :: V0 ( v) ;
19+ if stop {
20+ return v;
21+ }
22+ stop = true ;
23+ * val = Value :: V1 ;
24+ }
25+ }
26+
27+ #[ inline( never) ]
28+ #[ rustc_nounwind]
29+ fn get < T > ( v : & T ) -> & T {
30+ v
31+ }
Original file line number Diff line number Diff line change 1+ //@ compile-flags: -O
2+ //@ run-fail
3+
4+ pub enum Value {
5+ V0 ( i32 ) ,
6+ V1 ,
7+ }
8+
9+ fn set_discriminant ( val : & mut Value ) -> Value {
10+ let val_alias: & Value = get ( val) ;
11+ let mut stop = false ;
12+ let Value :: V0 ( v) = * val_alias else {
13+ unreachable ! ( ) ;
14+ } ;
15+ loop {
16+ let v = Value :: V0 ( v) ;
17+ if stop {
18+ return v;
19+ }
20+ stop = true ;
21+ * val = Value :: V1 ;
22+ }
23+ }
24+
25+ fn main ( ) {
26+ let mut v = Value :: V0 ( 1 ) ;
27+ let v = set_discriminant ( & mut v) ;
28+ assert ! ( matches!( v, Value :: V0 ( 1 ) ) ) ;
29+ }
30+
31+ #[ inline( never) ]
32+ fn get < T > ( v : & T ) -> & T {
33+ v
34+ }
You can’t perform that action at this time.
0 commit comments