Uh oh!
There was an error while loading. Please reload this page.
MIR: Don't generate 3-armed boolean switch from match. - #33583
Conversation
rust-highfive
commented
May 12, 2016
(rust_highfive has picked a reviewer for you, use r? to override) |
There was a problem hiding this comment.
seems...ok to me :) might be nice to be a touch more general (e.g., if there is an exhaustive u8)
There was a problem hiding this comment.
well, this commit alone is not enough, in that it invalidates the SwitchInt terminator's invariants. e.g. this comment on targets says:
/// Possible branch sites. The length of this vector should be/// equal to the length of the `values` vector plus 1 -- the/// extra item is the block to branch to if none of the values/// fit. targets:Vec<BasicBlock>,but here you are not generating the otherwise block. It'd be better to change terminator in that case I imagine?
luqmana
commented
May 12, 2016
Ok, changed SwitchInt to explicitly separate out the otherwise block and put it behind an |
arielb1
commented
May 12, 2016
I think we want to generate an |
nikomatsakis
commented
May 13, 2016
Or else change |
nagisa
commented
May 13, 2016
While not necessarily incorrect, that would result in a weird branch in trans since LLVM wants a |
luqmana
commented
May 13, 2016
We could definitely just take |
nikomatsakis
commented
May 13, 2016
I'd be happier with that... |
nikomatsakis
commented
May 13, 2016
...though I imagine we could make |
luqmana
commented
May 15, 2016
As in, SwitchInt during |
nikomatsakis
commented
May 16, 2016
@luqmana I think I meant in the trans code. But I'm happy either with using a distinct |
nikomatsakis
commented
May 25, 2016
@luqmana do you plan to update this PR to one of those two strategies? :) |
bors
commented
May 25, 2016
☔ The latest upstream changes (presumably #33667) made this pull request unmergeable. Please resolve the merge conflicts. |
luqmana
commented
May 28, 2016
@nikomatsakis Yup sorry, just got occupied with some other work. Anyways, updated the patch to just generate an If terminator for boolean types. |
There was a problem hiding this comment.
I guess this test should have #[rustc_mir]? And a comment explaining what it's all about?
luqmana
commented
Jun 2, 2016
Added attribute and comment to test. |
arielb1
commented
Jun 2, 2016
@bors r+ |
bors
commented
Jun 2, 2016
📌 Commit a97f6b3 has been approved by |
bors
commented
Jun 2, 2016
⌛ Testing commit a97f6b3 with merge 12d1653... |
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, @nagisa
Fixes#33540.
Snippet from issue:
Generated MIR:
Not sure about this approach. I was also thinking maybe just a standalone pass?
cc @arielb1, @nagisa