Skip to content

Commit ec25f08

Browse files
committed
Demonstration test for MIR building of checked shift operators
1 parent 5fa73a7 commit ec25f08

File tree

3 files changed

+314
-0
lines changed

3 files changed

+314
-0
lines changed

tests/mir-opt/building/shifts.rs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// compile-flags: -C debug-assertions=yes
2+
3+
// EMIT_MIR shifts.shift_signed.built.after.mir
4+
fn shift_signed(small: i8, big: u128, a: i8, b: i32, c: i128) -> ([i8; 3], [u128; 3]) {
5+
(
6+
[small >> a, small >> b, small >> c],
7+
[big << a, big << b, big << c],
8+
)
9+
}
10+
11+
// EMIT_MIR shifts.shift_unsigned.built.after.mir
12+
fn shift_unsigned(small: u8, big: i128, a: u8, b: u32, c: u128) -> ([u8; 3], [i128; 3]) {
13+
(
14+
[small >> a, small >> b, small >> c],
15+
[big << a, big << b, big << c],
16+
)
17+
}
18+
19+
fn main() {
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
// MIR for `shift_signed` after built
2+
3+
fn shift_signed(_1: i8, _2: u128, _3: i8, _4: i32, _5: i128) -> ([i8; 3], [u128; 3]) {
4+
debug small => _1; // in scope 0 at $DIR/shifts.rs:+0:17: +0:22
5+
debug big => _2; // in scope 0 at $DIR/shifts.rs:+0:28: +0:31
6+
debug a => _3; // in scope 0 at $DIR/shifts.rs:+0:39: +0:40
7+
debug b => _4; // in scope 0 at $DIR/shifts.rs:+0:46: +0:47
8+
debug c => _5; // in scope 0 at $DIR/shifts.rs:+0:54: +0:55
9+
let mut _0: ([i8; 3], [u128; 3]); // return place in scope 0 at $DIR/shifts.rs:+0:66: +0:86
10+
let mut _6: [i8; 3]; // in scope 0 at $DIR/shifts.rs:+2:9: +2:45
11+
let mut _7: i8; // in scope 0 at $DIR/shifts.rs:+2:10: +2:20
12+
let mut _8: i8; // in scope 0 at $DIR/shifts.rs:+2:10: +2:15
13+
let mut _9: i8; // in scope 0 at $DIR/shifts.rs:+2:19: +2:20
14+
let mut _10: i8; // in scope 0 at $DIR/shifts.rs:+2:10: +2:20
15+
let mut _11: bool; // in scope 0 at $DIR/shifts.rs:+2:10: +2:20
16+
let mut _12: i8; // in scope 0 at $DIR/shifts.rs:+2:22: +2:32
17+
let mut _13: i8; // in scope 0 at $DIR/shifts.rs:+2:22: +2:27
18+
let mut _14: i32; // in scope 0 at $DIR/shifts.rs:+2:31: +2:32
19+
let mut _15: i32; // in scope 0 at $DIR/shifts.rs:+2:22: +2:32
20+
let mut _16: bool; // in scope 0 at $DIR/shifts.rs:+2:22: +2:32
21+
let mut _17: i8; // in scope 0 at $DIR/shifts.rs:+2:34: +2:44
22+
let mut _18: i8; // in scope 0 at $DIR/shifts.rs:+2:34: +2:39
23+
let mut _19: i128; // in scope 0 at $DIR/shifts.rs:+2:43: +2:44
24+
let mut _20: i128; // in scope 0 at $DIR/shifts.rs:+2:34: +2:44
25+
let mut _21: bool; // in scope 0 at $DIR/shifts.rs:+2:34: +2:44
26+
let mut _22: [u128; 3]; // in scope 0 at $DIR/shifts.rs:+3:9: +3:39
27+
let mut _23: u128; // in scope 0 at $DIR/shifts.rs:+3:10: +3:18
28+
let mut _24: u128; // in scope 0 at $DIR/shifts.rs:+3:10: +3:13
29+
let mut _25: i8; // in scope 0 at $DIR/shifts.rs:+3:17: +3:18
30+
let mut _26: i8; // in scope 0 at $DIR/shifts.rs:+3:10: +3:18
31+
let mut _27: bool; // in scope 0 at $DIR/shifts.rs:+3:10: +3:18
32+
let mut _28: u128; // in scope 0 at $DIR/shifts.rs:+3:20: +3:28
33+
let mut _29: u128; // in scope 0 at $DIR/shifts.rs:+3:20: +3:23
34+
let mut _30: i32; // in scope 0 at $DIR/shifts.rs:+3:27: +3:28
35+
let mut _31: i32; // in scope 0 at $DIR/shifts.rs:+3:20: +3:28
36+
let mut _32: bool; // in scope 0 at $DIR/shifts.rs:+3:20: +3:28
37+
let mut _33: u128; // in scope 0 at $DIR/shifts.rs:+3:30: +3:38
38+
let mut _34: u128; // in scope 0 at $DIR/shifts.rs:+3:30: +3:33
39+
let mut _35: i128; // in scope 0 at $DIR/shifts.rs:+3:37: +3:38
40+
let mut _36: i128; // in scope 0 at $DIR/shifts.rs:+3:30: +3:38
41+
let mut _37: bool; // in scope 0 at $DIR/shifts.rs:+3:30: +3:38
42+
43+
bb0: {
44+
StorageLive(_6); // scope 0 at $DIR/shifts.rs:+2:9: +2:45
45+
StorageLive(_7); // scope 0 at $DIR/shifts.rs:+2:10: +2:20
46+
StorageLive(_8); // scope 0 at $DIR/shifts.rs:+2:10: +2:15
47+
_8 = _1; // scope 0 at $DIR/shifts.rs:+2:10: +2:15
48+
StorageLive(_9); // scope 0 at $DIR/shifts.rs:+2:19: +2:20
49+
_9 = _3; // scope 0 at $DIR/shifts.rs:+2:19: +2:20
50+
_10 = BitAnd(_9, const -8_i8); // scope 0 at $DIR/shifts.rs:+2:10: +2:20
51+
_11 = Ne(move _10, const 0_i8); // scope 0 at $DIR/shifts.rs:+2:10: +2:20
52+
assert(!move _11, "attempt to shift right by `{}`, which would overflow", _9) -> [success: bb1, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+2:10: +2:20
53+
}
54+
55+
bb1: {
56+
_7 = Shr(move _8, move _9); // scope 0 at $DIR/shifts.rs:+2:10: +2:20
57+
StorageDead(_9); // scope 0 at $DIR/shifts.rs:+2:19: +2:20
58+
StorageDead(_8); // scope 0 at $DIR/shifts.rs:+2:19: +2:20
59+
StorageLive(_12); // scope 0 at $DIR/shifts.rs:+2:22: +2:32
60+
StorageLive(_13); // scope 0 at $DIR/shifts.rs:+2:22: +2:27
61+
_13 = _1; // scope 0 at $DIR/shifts.rs:+2:22: +2:27
62+
StorageLive(_14); // scope 0 at $DIR/shifts.rs:+2:31: +2:32
63+
_14 = _4; // scope 0 at $DIR/shifts.rs:+2:31: +2:32
64+
_15 = BitAnd(_14, const -8_i32); // scope 0 at $DIR/shifts.rs:+2:22: +2:32
65+
_16 = Ne(move _15, const 0_i32); // scope 0 at $DIR/shifts.rs:+2:22: +2:32
66+
assert(!move _16, "attempt to shift right by `{}`, which would overflow", _14) -> [success: bb2, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+2:22: +2:32
67+
}
68+
69+
bb2: {
70+
_12 = Shr(move _13, move _14); // scope 0 at $DIR/shifts.rs:+2:22: +2:32
71+
StorageDead(_14); // scope 0 at $DIR/shifts.rs:+2:31: +2:32
72+
StorageDead(_13); // scope 0 at $DIR/shifts.rs:+2:31: +2:32
73+
StorageLive(_17); // scope 0 at $DIR/shifts.rs:+2:34: +2:44
74+
StorageLive(_18); // scope 0 at $DIR/shifts.rs:+2:34: +2:39
75+
_18 = _1; // scope 0 at $DIR/shifts.rs:+2:34: +2:39
76+
StorageLive(_19); // scope 0 at $DIR/shifts.rs:+2:43: +2:44
77+
_19 = _5; // scope 0 at $DIR/shifts.rs:+2:43: +2:44
78+
_20 = BitAnd(_19, const -8_i128); // scope 0 at $DIR/shifts.rs:+2:34: +2:44
79+
_21 = Ne(move _20, const 0_i128); // scope 0 at $DIR/shifts.rs:+2:34: +2:44
80+
assert(!move _21, "attempt to shift right by `{}`, which would overflow", _19) -> [success: bb3, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+2:34: +2:44
81+
}
82+
83+
bb3: {
84+
_17 = Shr(move _18, move _19); // scope 0 at $DIR/shifts.rs:+2:34: +2:44
85+
StorageDead(_19); // scope 0 at $DIR/shifts.rs:+2:43: +2:44
86+
StorageDead(_18); // scope 0 at $DIR/shifts.rs:+2:43: +2:44
87+
_6 = [move _7, move _12, move _17]; // scope 0 at $DIR/shifts.rs:+2:9: +2:45
88+
StorageDead(_17); // scope 0 at $DIR/shifts.rs:+2:44: +2:45
89+
StorageDead(_12); // scope 0 at $DIR/shifts.rs:+2:44: +2:45
90+
StorageDead(_7); // scope 0 at $DIR/shifts.rs:+2:44: +2:45
91+
StorageLive(_22); // scope 0 at $DIR/shifts.rs:+3:9: +3:39
92+
StorageLive(_23); // scope 0 at $DIR/shifts.rs:+3:10: +3:18
93+
StorageLive(_24); // scope 0 at $DIR/shifts.rs:+3:10: +3:13
94+
_24 = _2; // scope 0 at $DIR/shifts.rs:+3:10: +3:13
95+
StorageLive(_25); // scope 0 at $DIR/shifts.rs:+3:17: +3:18
96+
_25 = _3; // scope 0 at $DIR/shifts.rs:+3:17: +3:18
97+
_26 = BitAnd(_25, const i8::MIN); // scope 0 at $DIR/shifts.rs:+3:10: +3:18
98+
_27 = Ne(move _26, const 0_i8); // scope 0 at $DIR/shifts.rs:+3:10: +3:18
99+
assert(!move _27, "attempt to shift left by `{}`, which would overflow", _25) -> [success: bb4, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+3:10: +3:18
100+
}
101+
102+
bb4: {
103+
_23 = Shl(move _24, move _25); // scope 0 at $DIR/shifts.rs:+3:10: +3:18
104+
StorageDead(_25); // scope 0 at $DIR/shifts.rs:+3:17: +3:18
105+
StorageDead(_24); // scope 0 at $DIR/shifts.rs:+3:17: +3:18
106+
StorageLive(_28); // scope 0 at $DIR/shifts.rs:+3:20: +3:28
107+
StorageLive(_29); // scope 0 at $DIR/shifts.rs:+3:20: +3:23
108+
_29 = _2; // scope 0 at $DIR/shifts.rs:+3:20: +3:23
109+
StorageLive(_30); // scope 0 at $DIR/shifts.rs:+3:27: +3:28
110+
_30 = _4; // scope 0 at $DIR/shifts.rs:+3:27: +3:28
111+
_31 = BitAnd(_30, const -128_i32); // scope 0 at $DIR/shifts.rs:+3:20: +3:28
112+
_32 = Ne(move _31, const 0_i32); // scope 0 at $DIR/shifts.rs:+3:20: +3:28
113+
assert(!move _32, "attempt to shift left by `{}`, which would overflow", _30) -> [success: bb5, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+3:20: +3:28
114+
}
115+
116+
bb5: {
117+
_28 = Shl(move _29, move _30); // scope 0 at $DIR/shifts.rs:+3:20: +3:28
118+
StorageDead(_30); // scope 0 at $DIR/shifts.rs:+3:27: +3:28
119+
StorageDead(_29); // scope 0 at $DIR/shifts.rs:+3:27: +3:28
120+
StorageLive(_33); // scope 0 at $DIR/shifts.rs:+3:30: +3:38
121+
StorageLive(_34); // scope 0 at $DIR/shifts.rs:+3:30: +3:33
122+
_34 = _2; // scope 0 at $DIR/shifts.rs:+3:30: +3:33
123+
StorageLive(_35); // scope 0 at $DIR/shifts.rs:+3:37: +3:38
124+
_35 = _5; // scope 0 at $DIR/shifts.rs:+3:37: +3:38
125+
_36 = BitAnd(_35, const -128_i128); // scope 0 at $DIR/shifts.rs:+3:30: +3:38
126+
_37 = Ne(move _36, const 0_i128); // scope 0 at $DIR/shifts.rs:+3:30: +3:38
127+
assert(!move _37, "attempt to shift left by `{}`, which would overflow", _35) -> [success: bb6, unwind: bb7]; // scope 0 at $DIR/shifts.rs:+3:30: +3:38
128+
}
129+
130+
bb6: {
131+
_33 = Shl(move _34, move _35); // scope 0 at $DIR/shifts.rs:+3:30: +3:38
132+
StorageDead(_35); // scope 0 at $DIR/shifts.rs:+3:37: +3:38
133+
StorageDead(_34); // scope 0 at $DIR/shifts.rs:+3:37: +3:38
134+
_22 = [move _23, move _28, move _33]; // scope 0 at $DIR/shifts.rs:+3:9: +3:39
135+
StorageDead(_33); // scope 0 at $DIR/shifts.rs:+3:38: +3:39
136+
StorageDead(_28); // scope 0 at $DIR/shifts.rs:+3:38: +3:39
137+
StorageDead(_23); // scope 0 at $DIR/shifts.rs:+3:38: +3:39
138+
_0 = (move _6, move _22); // scope 0 at $DIR/shifts.rs:+1:5: +4:6
139+
StorageDead(_22); // scope 0 at $DIR/shifts.rs:+4:5: +4:6
140+
StorageDead(_6); // scope 0 at $DIR/shifts.rs:+4:5: +4:6
141+
return; // scope 0 at $DIR/shifts.rs:+5:2: +5:2
142+
}
143+
144+
bb7 (cleanup): {
145+
resume; // scope 0 at $DIR/shifts.rs:+0:1: +5:2
146+
}
147+
}

0 commit comments

Comments
 (0)