Closed
Description
The eq
implementation produces worse code than the equivalent C++ code (Rust, C++)
I tried this code:
pub struct S {
a: u8,
b: u8,
c: u8,
d: u8,
}
pub fn eq(s1: &S, s2: &S) -> bool {
s1.a == s2.a && s1.b == s2.b && s1.c == s2.c && s1.d == s2.d
}
I expected to see this happen:
The resulting assembly should load and compare a single u64:
example::eq:
ldr w8, [x0]
ldr w9, [x1]
cmp w8, w9
cset w0, eq
ret
Instead, this happened:
The assembly loads and compares each u8 individually:
example::eq:
ldrb w9, [x0]
mov w8, wzr
ldrb w10, [x1]
cmp w9, w10
b.ne .LBB0_4
ldrb w9, [x0, #1]
ldrb w10, [x1, #1]
cmp w9, w10
b.ne .LBB0_4
ldrb w8, [x0, #2]
ldrb w9, [x1, #2]
cmp w8, w9
b.ne .LBB0_5
ldrb w8, [x0, #3]
ldrb w9, [x1, #3]
cmp w8, w9
cset w8, eq
.LBB0_4:
mov w0, w8
ret
.LBB0_5:
mov w0, wzr
ret
Meta
rustc --version --verbose
:
rustc 1.68.0-nightly (88c58e3c2 2022-12-26)
binary: rustc
commit-hash: 88c58e3c2c097ebffac425d9e080dcb1aadf790e
commit-date: 2022-12-26
host: x86_64-unknown-linux-gnu
release: 1.68.0-nightly
LLVM version: 15.0.6
Compiler returned: 0
Metadata
Metadata
Assignees
Labels
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.Category: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Issue: Problems and improvements with respect to performance of generated code.Relevant to the compiler team, which will review and decide on the PR/issue.