-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
3-way comparison is branchier after 1.71 #125338
Comments
Alive2: https://alive2.llvm.org/ce/z/VqNWdC There are many limitations to hoisting branch instructions. I am not sure if it is better to change these limitations. |
It's actually a more fundamental issue than the case in the original post; even stripping down the code to just a binary enum still puts a branch in there. Godbolt #[derive(PartialEq)]
pub enum WSL {
Any,
V1,
}
#[inline(never)]
pub fn is_wsl(wsl: Option<WSL>, v: WSL) -> bool {
wsl.map(|wsl| wsl == v).unwrap_or(false)
} example::is_wsl::h2f539bf0253b949c:
cmp dil, 2
jne .LBB0_2
xor eax, eax
ret
.LBB0_2:
test dil, 1
sete al
xor al, sil
ret I'm going to leave the repro in the first post unmodified as the ideal fix would apply to that more difficult case as well, as this is just a contrived example. |
WG-prioritization assigning priority (Zulip discussion). @rustbot label -I-prioritize +P-medium |
While this was tagged as being fallout from #91743, it's a much later regression. bisecting the nightlies gives me these possible commits as the source of the regression:
I'm guessing it's #110705 |
You can bisect MIR inliner issues to any number of MIR inliner heuristic tweaks depending on the details of your reproducer. The problem here is an interaction with LLVM and MIR inlining in general, and blaming any particular heuristic tweak is a mistake. |
Thanks for the explanation, @saethlin. |
Code
The following code contains two impls of the same (or what should be the same) logic. Prior to 1.71.0, the first impl (using
Option::map()
instead ofmatch
) would generate llvm ir that could be optimized to usecmov
instructions, but the second impl (usingmatch
instead) would use jumps instead.1.71.0+ generate the same (branchy) llvm ir for both implementations.
The regression goes away if compiling with
-Zinline-mir=no
, but thematch
implementation remains branchy.Godbolt link
Optimized IR:
compiling to following x86_64:
vs unoptimized ir and asm:
Version it worked on
It most recently worked on: 1.70.0
Version with regression
rustc --version --verbose
:@rustbot modify labels: +regression-from-stable-to-stable -regression-untriaged +A-codegen +C-bug +I-slow +T-compiler
cc #91743
The text was updated successfully, but these errors were encountered: