Skip to content

Commit cd0613c

Browse files
committed
Extend GVN to perform local value numbering.
1 parent cc1959d commit cd0613c

32 files changed

+708
-187
lines changed

compiler/rustc_mir_transform/src/gvn.rs

Lines changed: 144 additions & 71 deletions
Large diffs are not rendered by default.

compiler/rustc_mir_transform/src/ssa.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,19 +99,23 @@ impl SsaLocals {
9999
ssa
100100
}
101101

102+
#[inline]
102103
pub(super) fn num_locals(&self) -> usize {
103104
self.assignments.len()
104105
}
105106

107+
#[inline]
106108
pub(super) fn locals(&self) -> impl Iterator<Item = Local> {
107109
self.assignments.indices()
108110
}
109111

112+
#[inline]
110113
pub(super) fn is_ssa(&self, local: Local) -> bool {
111114
matches!(self.assignments[local], Set1::One(_))
112115
}
113116

114117
/// Return the number of uses if a local that are not "Deref".
118+
#[inline]
115119
pub(super) fn num_direct_uses(&self, local: Local) -> u32 {
116120
self.direct_uses[local]
117121
}

tests/coverage/closure.cov-map

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,22 @@ Number of file 0 mappings: 66
7474
- Code(Counter(0)) at (prev + 1, 1) to (start + 0, 2)
7575
Highest counter ID seen: c1
7676

77-
Function name: closure::main::{closure#0}
78-
Raw bytes (51): 0x[01, 01, 01, 01, 05, 09, 01, 28, 05, 00, 06, 01, 01, 0d, 00, 1a, 01, 00, 1d, 00, 1e, 01, 01, 0c, 00, 14, 05, 00, 15, 02, 0a, 02, 02, 09, 00, 0a, 01, 01, 09, 00, 17, 01, 00, 18, 00, 20, 01, 01, 05, 00, 06]
77+
Function name: closure::main::{closure#0} (unused)
78+
Raw bytes (49): 0x[01, 01, 00, 09, 00, 28, 05, 00, 06, 00, 01, 0d, 00, 1a, 00, 00, 1d, 00, 1e, 00, 01, 0c, 00, 14, 00, 00, 15, 02, 0a, 00, 02, 09, 00, 0a, 00, 01, 09, 00, 17, 00, 00, 18, 00, 20, 00, 01, 05, 00, 06]
7979
Number of files: 1
8080
- file 0 => $DIR/closure.rs
81-
Number of expressions: 1
82-
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
81+
Number of expressions: 0
8382
Number of file 0 mappings: 9
84-
- Code(Counter(0)) at (prev + 40, 5) to (start + 0, 6)
85-
- Code(Counter(0)) at (prev + 1, 13) to (start + 0, 26)
86-
- Code(Counter(0)) at (prev + 0, 29) to (start + 0, 30)
87-
- Code(Counter(0)) at (prev + 1, 12) to (start + 0, 20)
88-
- Code(Counter(1)) at (prev + 0, 21) to (start + 2, 10)
89-
- Code(Expression(0, Sub)) at (prev + 2, 9) to (start + 0, 10)
90-
= (c0 - c1)
91-
- Code(Counter(0)) at (prev + 1, 9) to (start + 0, 23)
92-
- Code(Counter(0)) at (prev + 0, 24) to (start + 0, 32)
93-
- Code(Counter(0)) at (prev + 1, 5) to (start + 0, 6)
94-
Highest counter ID seen: c1
83+
- Code(Zero) at (prev + 40, 5) to (start + 0, 6)
84+
- Code(Zero) at (prev + 1, 13) to (start + 0, 26)
85+
- Code(Zero) at (prev + 0, 29) to (start + 0, 30)
86+
- Code(Zero) at (prev + 1, 12) to (start + 0, 20)
87+
- Code(Zero) at (prev + 0, 21) to (start + 2, 10)
88+
- Code(Zero) at (prev + 2, 9) to (start + 0, 10)
89+
- Code(Zero) at (prev + 1, 9) to (start + 0, 23)
90+
- Code(Zero) at (prev + 0, 24) to (start + 0, 32)
91+
- Code(Zero) at (prev + 1, 5) to (start + 0, 6)
92+
Highest counter ID seen: (none)
9593

9694
Function name: closure::main::{closure#10} (unused)
9795
Raw bytes (25): 0x[01, 01, 00, 04, 00, 9b, 01, 07, 00, 08, 00, 00, 09, 00, 11, 00, 00, 12, 00, 1e, 00, 00, 20, 00, 21]
@@ -199,24 +197,22 @@ Number of file 0 mappings: 7
199197
- Code(Counter(0)) at (prev + 2, 9) to (start + 0, 10)
200198
Highest counter ID seen: c1
201199

202-
Function name: closure::main::{closure#18}
203-
Raw bytes (51): 0x[01, 01, 01, 01, 05, 09, 01, 19, 0d, 00, 0e, 01, 01, 15, 00, 22, 01, 00, 25, 00, 26, 01, 01, 14, 00, 1c, 05, 00, 1d, 02, 12, 02, 02, 11, 00, 12, 01, 01, 11, 00, 1f, 01, 00, 20, 00, 28, 01, 01, 0d, 00, 0e]
200+
Function name: closure::main::{closure#18} (unused)
201+
Raw bytes (49): 0x[01, 01, 00, 09, 00, 19, 0d, 00, 0e, 00, 01, 15, 00, 22, 00, 00, 25, 00, 26, 00, 01, 14, 00, 1c, 00, 00, 1d, 02, 12, 00, 02, 11, 00, 12, 00, 01, 11, 00, 1f, 00, 00, 20, 00, 28, 00, 01, 0d, 00, 0e]
204202
Number of files: 1
205203
- file 0 => $DIR/closure.rs
206-
Number of expressions: 1
207-
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
204+
Number of expressions: 0
208205
Number of file 0 mappings: 9
209-
- Code(Counter(0)) at (prev + 25, 13) to (start + 0, 14)
210-
- Code(Counter(0)) at (prev + 1, 21) to (start + 0, 34)
211-
- Code(Counter(0)) at (prev + 0, 37) to (start + 0, 38)
212-
- Code(Counter(0)) at (prev + 1, 20) to (start + 0, 28)
213-
- Code(Counter(1)) at (prev + 0, 29) to (start + 2, 18)
214-
- Code(Expression(0, Sub)) at (prev + 2, 17) to (start + 0, 18)
215-
= (c0 - c1)
216-
- Code(Counter(0)) at (prev + 1, 17) to (start + 0, 31)
217-
- Code(Counter(0)) at (prev + 0, 32) to (start + 0, 40)
218-
- Code(Counter(0)) at (prev + 1, 13) to (start + 0, 14)
219-
Highest counter ID seen: c1
206+
- Code(Zero) at (prev + 25, 13) to (start + 0, 14)
207+
- Code(Zero) at (prev + 1, 21) to (start + 0, 34)
208+
- Code(Zero) at (prev + 0, 37) to (start + 0, 38)
209+
- Code(Zero) at (prev + 1, 20) to (start + 0, 28)
210+
- Code(Zero) at (prev + 0, 29) to (start + 2, 18)
211+
- Code(Zero) at (prev + 2, 17) to (start + 0, 18)
212+
- Code(Zero) at (prev + 1, 17) to (start + 0, 31)
213+
- Code(Zero) at (prev + 0, 32) to (start + 0, 40)
214+
- Code(Zero) at (prev + 1, 13) to (start + 0, 14)
215+
Highest counter ID seen: (none)
220216

221217
Function name: closure::main::{closure#19}
222218
Raw bytes (51): 0x[01, 01, 01, 01, 05, 09, 01, 43, 0d, 00, 0e, 01, 01, 15, 00, 22, 01, 00, 25, 00, 26, 01, 01, 14, 00, 1c, 05, 00, 1d, 02, 12, 02, 02, 11, 00, 12, 01, 01, 11, 00, 1f, 01, 00, 20, 00, 28, 01, 01, 0d, 00, 0e]
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
- // MIR for `borrow` before GVN
2+
+ // MIR for `borrow` after GVN
3+
4+
fn borrow() -> () {
5+
let mut _0: ();
6+
let mut _1: i32;
7+
let _2: ();
8+
let mut _3: i32;
9+
let _5: ();
10+
let mut _6: i32;
11+
scope 1 {
12+
debug x => _1;
13+
let _4: &i32;
14+
scope 2 {
15+
debug r => _4;
16+
}
17+
}
18+
19+
bb0: {
20+
- StorageLive(_1);
21+
+ nop;
22+
_1 = const 42_i32;
23+
StorageLive(_2);
24+
StorageLive(_3);
25+
- _3 = copy _1;
26+
- _2 = opaque::<i32>(move _3) -> [return: bb1, unwind unreachable];
27+
+ _3 = const 42_i32;
28+
+ _2 = opaque::<i32>(const 42_i32) -> [return: bb1, unwind unreachable];
29+
}
30+
31+
bb1: {
32+
StorageDead(_3);
33+
StorageDead(_2);
34+
StorageLive(_4);
35+
_4 = &_1;
36+
StorageLive(_5);
37+
StorageLive(_6);
38+
- _6 = copy _1;
39+
- _5 = opaque::<i32>(move _6) -> [return: bb2, unwind unreachable];
40+
+ _6 = const 42_i32;
41+
+ _5 = opaque::<i32>(const 42_i32) -> [return: bb2, unwind unreachable];
42+
}
43+
44+
bb2: {
45+
StorageDead(_6);
46+
StorageDead(_5);
47+
_0 = const ();
48+
StorageDead(_4);
49+
- StorageDead(_1);
50+
+ nop;
51+
return;
52+
}
53+
}
54+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
- // MIR for `constptr` before GVN
2+
+ // MIR for `constptr` after GVN
3+
4+
fn constptr() -> () {
5+
let mut _0: ();
6+
let mut _1: i32;
7+
let _2: ();
8+
let mut _3: i32;
9+
let _5: ();
10+
let mut _6: i32;
11+
scope 1 {
12+
debug x => _1;
13+
let _4: *const i32;
14+
scope 2 {
15+
debug r => _4;
16+
}
17+
}
18+
19+
bb0: {
20+
StorageLive(_1);
21+
_1 = const 42_i32;
22+
StorageLive(_2);
23+
StorageLive(_3);
24+
- _3 = copy _1;
25+
- _2 = opaque::<i32>(move _3) -> [return: bb1, unwind unreachable];
26+
+ _3 = const 42_i32;
27+
+ _2 = opaque::<i32>(const 42_i32) -> [return: bb1, unwind unreachable];
28+
}
29+
30+
bb1: {
31+
StorageDead(_3);
32+
StorageDead(_2);
33+
StorageLive(_4);
34+
_4 = &raw const _1;
35+
StorageLive(_5);
36+
StorageLive(_6);
37+
_6 = copy _1;
38+
_5 = opaque::<i32>(move _6) -> [return: bb2, unwind unreachable];
39+
}
40+
41+
bb2: {
42+
StorageDead(_6);
43+
StorageDead(_5);
44+
_0 = const ();
45+
StorageDead(_4);
46+
StorageDead(_1);
47+
return;
48+
}
49+
}
50+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
- // MIR for `mutborrow` before GVN
2+
+ // MIR for `mutborrow` after GVN
3+
4+
fn mutborrow() -> () {
5+
let mut _0: ();
6+
let mut _1: i32;
7+
let _2: ();
8+
let mut _3: i32;
9+
let _5: ();
10+
let mut _6: i32;
11+
scope 1 {
12+
debug x => _1;
13+
let _4: &mut i32;
14+
scope 2 {
15+
debug r => _4;
16+
}
17+
}
18+
19+
bb0: {
20+
StorageLive(_1);
21+
_1 = const 42_i32;
22+
StorageLive(_2);
23+
StorageLive(_3);
24+
- _3 = copy _1;
25+
- _2 = opaque::<i32>(move _3) -> [return: bb1, unwind unreachable];
26+
+ _3 = const 42_i32;
27+
+ _2 = opaque::<i32>(const 42_i32) -> [return: bb1, unwind unreachable];
28+
}
29+
30+
bb1: {
31+
StorageDead(_3);
32+
StorageDead(_2);
33+
StorageLive(_4);
34+
_4 = &mut _1;
35+
StorageLive(_5);
36+
StorageLive(_6);
37+
_6 = copy _1;
38+
_5 = opaque::<i32>(move _6) -> [return: bb2, unwind unreachable];
39+
}
40+
41+
bb2: {
42+
StorageDead(_6);
43+
StorageDead(_5);
44+
_0 = const ();
45+
StorageDead(_4);
46+
StorageDead(_1);
47+
return;
48+
}
49+
}
50+
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
- // MIR for `mutptr` before GVN
2+
+ // MIR for `mutptr` after GVN
3+
4+
fn mutptr() -> () {
5+
let mut _0: ();
6+
let mut _1: i32;
7+
let _2: ();
8+
let mut _3: i32;
9+
let _5: ();
10+
let mut _6: i32;
11+
scope 1 {
12+
debug x => _1;
13+
let _4: *mut i32;
14+
scope 2 {
15+
debug r => _4;
16+
}
17+
}
18+
19+
bb0: {
20+
StorageLive(_1);
21+
_1 = const 42_i32;
22+
StorageLive(_2);
23+
StorageLive(_3);
24+
- _3 = copy _1;
25+
- _2 = opaque::<i32>(move _3) -> [return: bb1, unwind unreachable];
26+
+ _3 = const 42_i32;
27+
+ _2 = opaque::<i32>(const 42_i32) -> [return: bb1, unwind unreachable];
28+
}
29+
30+
bb1: {
31+
StorageDead(_3);
32+
StorageDead(_2);
33+
StorageLive(_4);
34+
_4 = &raw mut _1;
35+
StorageLive(_5);
36+
StorageLive(_6);
37+
_6 = copy _1;
38+
_5 = opaque::<i32>(move _6) -> [return: bb2, unwind unreachable];
39+
}
40+
41+
bb2: {
42+
StorageDead(_6);
43+
StorageDead(_5);
44+
_0 = const ();
45+
StorageDead(_4);
46+
StorageDead(_1);
47+
return;
48+
}
49+
}
50+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
- // MIR for `nonfreeze` before GVN
2+
+ // MIR for `nonfreeze` after GVN
3+
4+
fn nonfreeze(_1: T) -> () {
5+
debug x => _1;
6+
let mut _0: ();
7+
let mut _2: T;
8+
let _3: ();
9+
let mut _4: T;
10+
let _6: ();
11+
let mut _7: T;
12+
let _8: ();
13+
let mut _9: T;
14+
scope 1 {
15+
debug y => _2;
16+
let _5: &T;
17+
scope 2 {
18+
debug r => _5;
19+
}
20+
}
21+
22+
bb0: {
23+
- StorageLive(_2);
24+
+ nop;
25+
_2 = copy _1;
26+
StorageLive(_3);
27+
StorageLive(_4);
28+
_4 = copy _2;
29+
- _3 = opaque::<T>(move _4) -> [return: bb1, unwind unreachable];
30+
+ _3 = opaque::<T>(copy _2) -> [return: bb1, unwind unreachable];
31+
}
32+
33+
bb1: {
34+
StorageDead(_4);
35+
StorageDead(_3);
36+
StorageLive(_5);
37+
_5 = &_1;
38+
StorageLive(_6);
39+
StorageLive(_7);
40+
_7 = copy _1;
41+
_6 = opaque::<T>(move _7) -> [return: bb2, unwind unreachable];
42+
}
43+
44+
bb2: {
45+
StorageDead(_7);
46+
StorageDead(_6);
47+
StorageLive(_8);
48+
StorageLive(_9);
49+
_9 = copy _2;
50+
- _8 = opaque::<T>(move _9) -> [return: bb3, unwind unreachable];
51+
+ _8 = opaque::<T>(copy _2) -> [return: bb3, unwind unreachable];
52+
}
53+
54+
bb3: {
55+
StorageDead(_9);
56+
StorageDead(_8);
57+
_0 = const ();
58+
StorageDead(_5);
59+
- StorageDead(_2);
60+
+ nop;
61+
return;
62+
}
63+
}
64+

0 commit comments

Comments
 (0)