Skip to content

Commit 8af6511

Browse files
committed
Extend the tests for SimplifyArmIdentity.
This adds a couple more tests checking code that should be optimized, and even more checking code that shouldn't be.
1 parent 377a361 commit 8af6511

8 files changed

+424
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
- // MIR for `multi_field_id` before SimplifyArmIdentity
2+
+ // MIR for `multi_field_id` after SimplifyArmIdentity
3+
4+
fn multi_field_id(_1: MultiField) -> MultiField {
5+
debug x => _1; // in scope 0 at $DIR/simplify_arm.rs:50:19: 50:20
6+
let mut _0: MultiField; // return place in scope 0 at $DIR/simplify_arm.rs:50:37: 50:47
7+
let mut _2: isize; // in scope 0 at $DIR/simplify_arm.rs:52:9: 52:28
8+
- let _3: u32; // in scope 0 at $DIR/simplify_arm.rs:52:23: 52:24
9+
- let _4: u32; // in scope 0 at $DIR/simplify_arm.rs:52:26: 52:27
10+
- let mut _5: u32; // in scope 0 at $DIR/simplify_arm.rs:52:46: 52:47
11+
- let mut _6: u32; // in scope 0 at $DIR/simplify_arm.rs:52:49: 52:50
12+
- let _7: u32; // in scope 0 at $DIR/simplify_arm.rs:53:23: 53:24
13+
- let _8: u32; // in scope 0 at $DIR/simplify_arm.rs:53:26: 53:27
14+
- let _9: u32; // in scope 0 at $DIR/simplify_arm.rs:53:29: 53:30
15+
- let mut _10: u32; // in scope 0 at $DIR/simplify_arm.rs:53:49: 53:50
16+
- let mut _11: u32; // in scope 0 at $DIR/simplify_arm.rs:53:52: 53:53
17+
- let mut _12: u32; // in scope 0 at $DIR/simplify_arm.rs:53:55: 53:56
18+
scope 1 {
19+
- debug a => _3; // in scope 1 at $DIR/simplify_arm.rs:52:23: 52:24
20+
- debug b => _4; // in scope 1 at $DIR/simplify_arm.rs:52:26: 52:27
21+
+ debug a => ((_0 as A).0: u32); // in scope 1 at $DIR/simplify_arm.rs:52:23: 52:24
22+
+ debug b => ((_0 as A).1: u32); // in scope 1 at $DIR/simplify_arm.rs:52:26: 52:27
23+
}
24+
scope 2 {
25+
- debug a => _7; // in scope 2 at $DIR/simplify_arm.rs:53:23: 53:24
26+
- debug b => _8; // in scope 2 at $DIR/simplify_arm.rs:53:26: 53:27
27+
- debug c => _9; // in scope 2 at $DIR/simplify_arm.rs:53:29: 53:30
28+
+ debug a => ((_0 as B).0: u32); // in scope 2 at $DIR/simplify_arm.rs:53:23: 53:24
29+
+ debug b => ((_0 as B).1: u32); // in scope 2 at $DIR/simplify_arm.rs:53:26: 53:27
30+
+ debug c => ((_0 as B).2: u32); // in scope 2 at $DIR/simplify_arm.rs:53:29: 53:30
31+
}
32+
33+
bb0: {
34+
_2 = discriminant(_1); // scope 0 at $DIR/simplify_arm.rs:51:11: 51:12
35+
switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify_arm.rs:51:5: 51:12
36+
}
37+
38+
bb1: {
39+
- StorageLive(_7); // scope 0 at $DIR/simplify_arm.rs:53:23: 53:24
40+
- _7 = ((_1 as B).0: u32); // scope 0 at $DIR/simplify_arm.rs:53:23: 53:24
41+
- StorageLive(_8); // scope 0 at $DIR/simplify_arm.rs:53:26: 53:27
42+
- _8 = ((_1 as B).1: u32); // scope 0 at $DIR/simplify_arm.rs:53:26: 53:27
43+
- StorageLive(_9); // scope 0 at $DIR/simplify_arm.rs:53:29: 53:30
44+
- _9 = ((_1 as B).2: u32); // scope 0 at $DIR/simplify_arm.rs:53:29: 53:30
45+
- StorageLive(_10); // scope 2 at $DIR/simplify_arm.rs:53:49: 53:50
46+
- _10 = _7; // scope 2 at $DIR/simplify_arm.rs:53:49: 53:50
47+
- StorageLive(_11); // scope 2 at $DIR/simplify_arm.rs:53:52: 53:53
48+
- _11 = _8; // scope 2 at $DIR/simplify_arm.rs:53:52: 53:53
49+
- StorageLive(_12); // scope 2 at $DIR/simplify_arm.rs:53:55: 53:56
50+
- _12 = _9; // scope 2 at $DIR/simplify_arm.rs:53:55: 53:56
51+
- ((_0 as B).0: u32) = move _10; // scope 2 at $DIR/simplify_arm.rs:53:35: 53:57
52+
- ((_0 as B).1: u32) = move _11; // scope 2 at $DIR/simplify_arm.rs:53:35: 53:57
53+
- ((_0 as B).2: u32) = move _12; // scope 2 at $DIR/simplify_arm.rs:53:35: 53:57
54+
- discriminant(_0) = 1; // scope 2 at $DIR/simplify_arm.rs:53:35: 53:57
55+
- StorageDead(_12); // scope 2 at $DIR/simplify_arm.rs:53:56: 53:57
56+
- StorageDead(_11); // scope 2 at $DIR/simplify_arm.rs:53:56: 53:57
57+
- StorageDead(_10); // scope 2 at $DIR/simplify_arm.rs:53:56: 53:57
58+
- StorageDead(_9); // scope 0 at $DIR/simplify_arm.rs:53:56: 53:57
59+
- StorageDead(_8); // scope 0 at $DIR/simplify_arm.rs:53:56: 53:57
60+
- StorageDead(_7); // scope 0 at $DIR/simplify_arm.rs:53:56: 53:57
61+
+ _0 = _1; // scope 2 at $DIR/simplify_arm.rs:53:35: 53:57
62+
return; // scope 0 at $DIR/simplify_arm.rs:53:56: 53:57
63+
}
64+
65+
bb2: {
66+
- StorageLive(_3); // scope 0 at $DIR/simplify_arm.rs:52:23: 52:24
67+
- _3 = ((_1 as A).0: u32); // scope 0 at $DIR/simplify_arm.rs:52:23: 52:24
68+
- StorageLive(_4); // scope 0 at $DIR/simplify_arm.rs:52:26: 52:27
69+
- _4 = ((_1 as A).1: u32); // scope 0 at $DIR/simplify_arm.rs:52:26: 52:27
70+
- StorageLive(_5); // scope 1 at $DIR/simplify_arm.rs:52:46: 52:47
71+
- _5 = _3; // scope 1 at $DIR/simplify_arm.rs:52:46: 52:47
72+
- StorageLive(_6); // scope 1 at $DIR/simplify_arm.rs:52:49: 52:50
73+
- _6 = _4; // scope 1 at $DIR/simplify_arm.rs:52:49: 52:50
74+
- ((_0 as A).0: u32) = move _5; // scope 1 at $DIR/simplify_arm.rs:52:32: 52:51
75+
- ((_0 as A).1: u32) = move _6; // scope 1 at $DIR/simplify_arm.rs:52:32: 52:51
76+
- discriminant(_0) = 0; // scope 1 at $DIR/simplify_arm.rs:52:32: 52:51
77+
- StorageDead(_6); // scope 1 at $DIR/simplify_arm.rs:52:50: 52:51
78+
- StorageDead(_5); // scope 1 at $DIR/simplify_arm.rs:52:50: 52:51
79+
- StorageDead(_4); // scope 0 at $DIR/simplify_arm.rs:52:50: 52:51
80+
- StorageDead(_3); // scope 0 at $DIR/simplify_arm.rs:52:50: 52:51
81+
+ _0 = _1; // scope 1 at $DIR/simplify_arm.rs:52:32: 52:51
82+
return; // scope 0 at $DIR/simplify_arm.rs:52:50: 52:51
83+
}
84+
}
85+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
- // MIR for `non_copy_id` before SimplifyArmIdentity
2+
+ // MIR for `non_copy_id` after SimplifyArmIdentity
3+
4+
fn non_copy_id(_1: NonCopy) -> NonCopy {
5+
debug x => _1; // in scope 0 at $DIR/simplify_arm.rs:63:16: 63:17
6+
let mut _0: NonCopy; // return place in scope 0 at $DIR/simplify_arm.rs:63:31: 63:38
7+
let mut _2: isize; // in scope 0 at $DIR/simplify_arm.rs:65:9: 65:22
8+
- let _3: std::string::String; // in scope 0 at $DIR/simplify_arm.rs:65:20: 65:21
9+
- let mut _4: std::string::String; // in scope 0 at $DIR/simplify_arm.rs:65:37: 65:38
10+
- let _5: std::vec::Vec<u32>; // in scope 0 at $DIR/simplify_arm.rs:66:20: 66:21
11+
- let mut _6: std::vec::Vec<u32>; // in scope 0 at $DIR/simplify_arm.rs:66:37: 66:38
12+
- let mut _7: bool; // in scope 0 at $DIR/simplify_arm.rs:68:1: 68:2
13+
- let mut _8: bool; // in scope 0 at $DIR/simplify_arm.rs:68:1: 68:2
14+
- let mut _9: isize; // in scope 0 at $DIR/simplify_arm.rs:68:1: 68:2
15+
- let mut _10: isize; // in scope 0 at $DIR/simplify_arm.rs:68:1: 68:2
16+
scope 1 {
17+
- debug a => _3; // in scope 1 at $DIR/simplify_arm.rs:65:20: 65:21
18+
+ debug a => ((_0 as A).0: std::string::String); // in scope 1 at $DIR/simplify_arm.rs:65:20: 65:21
19+
}
20+
scope 2 {
21+
- debug b => _5; // in scope 2 at $DIR/simplify_arm.rs:66:20: 66:21
22+
+ debug b => ((_0 as B).0: std::vec::Vec<u32>); // in scope 2 at $DIR/simplify_arm.rs:66:20: 66:21
23+
}
24+
25+
bb0: {
26+
- _7 = const false; // scope 0 at $DIR/simplify_arm.rs:64:11: 64:12
27+
- _8 = const false; // scope 0 at $DIR/simplify_arm.rs:64:11: 64:12
28+
- _7 = const true; // scope 0 at $DIR/simplify_arm.rs:64:11: 64:12
29+
- _8 = const true; // scope 0 at $DIR/simplify_arm.rs:64:11: 64:12
30+
_2 = discriminant(_1); // scope 0 at $DIR/simplify_arm.rs:64:11: 64:12
31+
switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify_arm.rs:64:5: 64:12
32+
}
33+
34+
bb1: {
35+
- StorageLive(_5); // scope 0 at $DIR/simplify_arm.rs:66:20: 66:21
36+
- _5 = move ((_1 as B).0: std::vec::Vec<u32>); // scope 0 at $DIR/simplify_arm.rs:66:20: 66:21
37+
- StorageLive(_6); // scope 2 at $DIR/simplify_arm.rs:66:37: 66:38
38+
- _6 = move _5; // scope 2 at $DIR/simplify_arm.rs:66:37: 66:38
39+
- ((_0 as B).0: std::vec::Vec<u32>) = move _6; // scope 2 at $DIR/simplify_arm.rs:66:26: 66:39
40+
- discriminant(_0) = 1; // scope 2 at $DIR/simplify_arm.rs:66:26: 66:39
41+
- StorageDead(_6); // scope 2 at $DIR/simplify_arm.rs:66:38: 66:39
42+
- StorageDead(_5); // scope 0 at $DIR/simplify_arm.rs:66:38: 66:39
43+
+ _0 = move _1; // scope 2 at $DIR/simplify_arm.rs:66:26: 66:39
44+
goto -> bb3; // scope 0 at $DIR/simplify_arm.rs:66:38: 66:39
45+
}
46+
47+
bb2: {
48+
- StorageLive(_3); // scope 0 at $DIR/simplify_arm.rs:65:20: 65:21
49+
- _3 = move ((_1 as A).0: std::string::String); // scope 0 at $DIR/simplify_arm.rs:65:20: 65:21
50+
- StorageLive(_4); // scope 1 at $DIR/simplify_arm.rs:65:37: 65:38
51+
- _4 = move _3; // scope 1 at $DIR/simplify_arm.rs:65:37: 65:38
52+
- ((_0 as A).0: std::string::String) = move _4; // scope 1 at $DIR/simplify_arm.rs:65:26: 65:39
53+
- discriminant(_0) = 0; // scope 1 at $DIR/simplify_arm.rs:65:26: 65:39
54+
- StorageDead(_4); // scope 1 at $DIR/simplify_arm.rs:65:38: 65:39
55+
- StorageDead(_3); // scope 0 at $DIR/simplify_arm.rs:65:38: 65:39
56+
+ _0 = move _1; // scope 1 at $DIR/simplify_arm.rs:65:26: 65:39
57+
goto -> bb3; // scope 0 at $DIR/simplify_arm.rs:65:38: 65:39
58+
}
59+
60+
bb3: {
61+
- _9 = discriminant(_1); // scope 0 at $DIR/simplify_arm.rs:68:1: 68:2
62+
return; // scope 0 at $DIR/simplify_arm.rs:68:2: 68:2
63+
}
64+
}
65+

src/test/mir-opt/simplify_arm.rs

+34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
// compile-flags: -Zunsound-mir-opts
2+
13
// EMIT_MIR simplify_arm.id.SimplifyArmIdentity.diff
4+
// EMIT_MIR simplify_arm.id.SimplifyBranchSame.diff
25
fn id(o: Option<u8>) -> Option<u8> {
36
match o {
47
Some(v) => Some(v),
@@ -7,6 +10,7 @@ fn id(o: Option<u8>) -> Option<u8> {
710
}
811

912
// EMIT_MIR simplify_arm.id_result.SimplifyArmIdentity.diff
13+
// EMIT_MIR simplify_arm.id_result.SimplifyBranchSame.diff
1014
fn id_result(r: Result<u8, i32>) -> Result<u8, i32> {
1115
match r {
1216
Ok(x) => Ok(x),
@@ -27,6 +31,7 @@ fn from_error<T, E>(e: E) -> Result<T, E> {
2731
// FIXME(#85133): while this might be useful for `r#try!`, it would be nice to have a MIR
2832
// optimization that picks up the `?` desugaring, as `SimplifyArmIdentity` does not.
2933
// EMIT_MIR simplify_arm.id_try.SimplifyArmIdentity.diff
34+
// EMIT_MIR simplify_arm.id_try.SimplifyBranchSame.diff
3035
fn id_try(r: Result<u8, i32>) -> Result<u8, i32> {
3136
let x = match into_result(r) {
3237
Err(e) => return from_error(From::from(e)),
@@ -35,8 +40,37 @@ fn id_try(r: Result<u8, i32>) -> Result<u8, i32> {
3540
Ok(x)
3641
}
3742

43+
#[derive(Copy, Clone)]
44+
enum MultiField {
45+
A(u32, u32),
46+
B(u32, u32, u32),
47+
}
48+
49+
// EMIT_MIR simplify_arm.multi_field_id.SimplifyArmIdentity.diff
50+
fn multi_field_id(x: MultiField) -> MultiField {
51+
match x {
52+
MultiField::A(a, b) => MultiField::A(a, b),
53+
MultiField::B(a, b, c) => MultiField::B(a, b, c),
54+
}
55+
}
56+
57+
enum NonCopy {
58+
A(String),
59+
B(Vec<u32>),
60+
}
61+
62+
// EMIT_MIR simplify_arm.non_copy_id.SimplifyArmIdentity.diff
63+
fn non_copy_id(x: NonCopy) -> NonCopy {
64+
match x {
65+
NonCopy::A(a) => NonCopy::A(a),
66+
NonCopy::B(b) => NonCopy::B(b),
67+
}
68+
}
69+
3870
fn main() {
3971
id(None);
4072
id_result(Ok(4));
4173
id_try(Ok(4));
74+
multi_field_id(MultiField::A(0, 0));
75+
non_copy_id(NonCopy::A(String::new()));
4276
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
- // MIR for `mismatched_variant` before SimplifyArmIdentity
2+
+ // MIR for `mismatched_variant` after SimplifyArmIdentity
3+
4+
fn mismatched_variant(_1: Result<u32, u32>) -> Result<u32, u32> {
5+
debug x => _1; // in scope 0 at $DIR/simplify_arm_correctness.rs:33:23: 33:24
6+
let mut _0: std::result::Result<u32, u32>; // return place in scope 0 at $DIR/simplify_arm_correctness.rs:33:47: 33:63
7+
let mut _2: isize; // in scope 0 at $DIR/simplify_arm_correctness.rs:35:9: 35:14
8+
let _3: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:35:12: 35:13
9+
let mut _4: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:35:22: 35:23
10+
let _5: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:36:13: 36:14
11+
let mut _6: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:36:22: 36:23
12+
scope 1 {
13+
debug a => _3; // in scope 1 at $DIR/simplify_arm_correctness.rs:35:12: 35:13
14+
}
15+
scope 2 {
16+
debug a => _5; // in scope 2 at $DIR/simplify_arm_correctness.rs:36:13: 36:14
17+
}
18+
19+
bb0: {
20+
_2 = discriminant(_1); // scope 0 at $DIR/simplify_arm_correctness.rs:34:11: 34:12
21+
switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify_arm_correctness.rs:34:5: 34:12
22+
}
23+
24+
bb1: {
25+
StorageLive(_5); // scope 0 at $DIR/simplify_arm_correctness.rs:36:13: 36:14
26+
_5 = ((_1 as Err).0: u32); // scope 0 at $DIR/simplify_arm_correctness.rs:36:13: 36:14
27+
StorageLive(_6); // scope 2 at $DIR/simplify_arm_correctness.rs:36:22: 36:23
28+
_6 = _5; // scope 2 at $DIR/simplify_arm_correctness.rs:36:22: 36:23
29+
((_0 as Ok).0: u32) = move _6; // scope 2 at $DIR/simplify_arm_correctness.rs:36:19: 36:24
30+
discriminant(_0) = 0; // scope 2 at $DIR/simplify_arm_correctness.rs:36:19: 36:24
31+
StorageDead(_6); // scope 2 at $DIR/simplify_arm_correctness.rs:36:23: 36:24
32+
StorageDead(_5); // scope 0 at $DIR/simplify_arm_correctness.rs:36:23: 36:24
33+
return; // scope 0 at $DIR/simplify_arm_correctness.rs:36:23: 36:24
34+
}
35+
36+
bb2: {
37+
StorageLive(_3); // scope 0 at $DIR/simplify_arm_correctness.rs:35:12: 35:13
38+
_3 = ((_1 as Ok).0: u32); // scope 0 at $DIR/simplify_arm_correctness.rs:35:12: 35:13
39+
StorageLive(_4); // scope 1 at $DIR/simplify_arm_correctness.rs:35:22: 35:23
40+
_4 = _3; // scope 1 at $DIR/simplify_arm_correctness.rs:35:22: 35:23
41+
((_0 as Err).0: u32) = move _4; // scope 1 at $DIR/simplify_arm_correctness.rs:35:18: 35:24
42+
discriminant(_0) = 1; // scope 1 at $DIR/simplify_arm_correctness.rs:35:18: 35:24
43+
StorageDead(_4); // scope 1 at $DIR/simplify_arm_correctness.rs:35:23: 35:24
44+
StorageDead(_3); // scope 0 at $DIR/simplify_arm_correctness.rs:35:23: 35:24
45+
return; // scope 0 at $DIR/simplify_arm_correctness.rs:35:23: 35:24
46+
}
47+
}
48+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
- // MIR for `mixed_copy_a_id` before SimplifyArmIdentity
2+
+ // MIR for `mixed_copy_a_id` after SimplifyArmIdentity
3+
4+
fn mixed_copy_a_id(_1: MixedCopyA) -> MixedCopyA {
5+
debug x => _1; // in scope 0 at $DIR/simplify_arm_correctness.rs:12:20: 12:21
6+
let mut _0: MixedCopyA; // return place in scope 0 at $DIR/simplify_arm_correctness.rs:12:38: 12:48
7+
let mut _2: isize; // in scope 0 at $DIR/simplify_arm_correctness.rs:14:9: 14:25
8+
let _3: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:14:23: 14:24
9+
let mut _4: u32; // in scope 0 at $DIR/simplify_arm_correctness.rs:14:43: 14:44
10+
scope 1 {
11+
debug a => _3; // in scope 1 at $DIR/simplify_arm_correctness.rs:14:23: 14:24
12+
}
13+
14+
bb0: {
15+
_2 = discriminant(_1); // scope 0 at $DIR/simplify_arm_correctness.rs:13:11: 13:12
16+
switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/simplify_arm_correctness.rs:13:5: 13:12
17+
}
18+
19+
bb1: {
20+
discriminant(_0) = 1; // scope 0 at $DIR/simplify_arm_correctness.rs:15:26: 15:39
21+
return; // scope 0 at $DIR/simplify_arm_correctness.rs:15:26: 15:39
22+
}
23+
24+
bb2: {
25+
StorageLive(_3); // scope 0 at $DIR/simplify_arm_correctness.rs:14:23: 14:24
26+
_3 = ((_1 as A).0: u32); // scope 0 at $DIR/simplify_arm_correctness.rs:14:23: 14:24
27+
StorageLive(_4); // scope 1 at $DIR/simplify_arm_correctness.rs:14:43: 14:44
28+
_4 = _3; // scope 1 at $DIR/simplify_arm_correctness.rs:14:43: 14:44
29+
((_0 as A).0: u32) = move _4; // scope 1 at $DIR/simplify_arm_correctness.rs:14:29: 14:45
30+
discriminant(_0) = 0; // scope 1 at $DIR/simplify_arm_correctness.rs:14:29: 14:45
31+
StorageDead(_4); // scope 1 at $DIR/simplify_arm_correctness.rs:14:44: 14:45
32+
StorageDead(_3); // scope 0 at $DIR/simplify_arm_correctness.rs:14:44: 14:45
33+
return; // scope 0 at $DIR/simplify_arm_correctness.rs:14:44: 14:45
34+
}
35+
}
36+

0 commit comments

Comments
 (0)