Commit 12d1653
committed
Auto merge of #33583 - luqmana:tri-bool-mir, r=arielb1
MIR: Don't generate 3-armed boolean switch from match.
Fixes #33540.
Snippet from issue:
```Rust
fn foo(x: bool, y: bool) -> u32 {
match (x, y) {
(false, _) => 0,
(_, false) => 1,
(true, true) => 2,
}
}
```
Generated MIR:
```
fn foo(arg0: bool, arg1: bool) -> u32 {
let var0: bool; // "x" in scope 1 at 3bbm.rs:17:8: 17:9
let var1: bool; // "y" in scope 1 at 3bbm.rs:17:17: 17:18
let mut tmp0: (bool, bool);
let mut tmp1: bool;
let mut tmp2: bool;
let mut tmp3: (&'static str, &'static str, u32);
let mut tmp4: &'static (&'static str, &'static str, u32);
bb0: {
var0 = arg0; // scope 1 at 3bbm.rs:17:8: 17:9
var1 = arg1; // scope 1 at 3bbm.rs:17:17: 17:18
tmp1 = var0; // scope 5 at 3bbm.rs:18:12: 18:13
tmp2 = var1; // scope 6 at 3bbm.rs:18:15: 18:16
tmp0 = (tmp1, tmp2); // scope 4 at 3bbm.rs:18:11: 18:17
if((tmp0.0: bool)) -> [true: bb4, false: bb1]; // scope 3 at 3bbm.rs:19:10: 19:15
}
bb1: {
return = const 0u32; // scope 10 at 3bbm.rs:19:23: 19:24
goto -> bb7; // scope 3 at 3bbm.rs:18:5: 22:6
}
bb2: {
return = const 1u32; // scope 11 at 3bbm.rs:20:23: 20:24
goto -> bb7; // scope 3 at 3bbm.rs:18:5: 22:6
}
bb3: {
return = const 2u32; // scope 12 at 3bbm.rs:21:25: 21:26
goto -> bb7; // scope 3 at 3bbm.rs:18:5: 22:6
}
bb4: {
if((tmp0.1: bool)) -> [true: bb5, false: bb2]; // scope 3 at 3bbm.rs:20:13: 20:18
}
bb5: {
if((tmp0.0: bool)) -> [true: bb3, false: bb6]; // scope 3 at 3bbm.rs:21:10: 21:14
}
bb6: {
tmp4 = promoted0; // scope 3 at 3bbm.rs:18:5: 22:6
core::panicking::panic(tmp4); // scope 3 at 3bbm.rs:18:5: 22:6
}
bb7: {
return; // scope 0 at 3bbm.rs:17:1: 23:2
}
}
```
Not sure about this approach. I was also thinking maybe just a standalone pass?
cc @arielb1, @nagisaFile tree
2 files changed
+78
-12
lines changed- src
- librustc_mir/build/matches
- test/run-pass
2 files changed
+78
-12
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
162 | 162 | | |
163 | 163 | | |
164 | 164 | | |
165 | | - | |
166 | | - | |
167 | | - | |
168 | | - | |
169 | | - | |
170 | | - | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
171 | 208 | | |
172 | 209 | | |
173 | 210 | | |
174 | | - | |
175 | | - | |
176 | | - | |
177 | | - | |
178 | | - | |
179 | | - | |
| 211 | + | |
180 | 212 | | |
181 | 213 | | |
182 | 214 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
0 commit comments