[llvm-dev] [RFC] Optimizing Comparisons Chains
Clement Courbet via llvm-dev
llvm-dev at lists.llvm.org
Wed Jun 7 09:00:40 PDT 2017
Hi all,
I'm working on a new pass to optimize comparison chains.
Motivation
Clang currently generates inefficient code when dealing with contiguous
member-by-member structural equality. Consider:
struct A {
bool operator==(const A& o) const { return i == o.i && j == o.j; }
uint32 i;
uint32 j;
};
This generates:
mov eax, dword ptr [rdi]
cmp eax, dword ptr [rsi]
jne .LBB0_1
mov eax, dword ptr [rdi + 4]
cmp eax, dword ptr [rsi + 4]
sete al
ret
.LBB0_1:
xor eax, eax
ret
I’ve been working on an LLVM pass that detects this pattern at IR level and
turns it into a memcmp() call. This generates more efficient code:
mov rax, qword ptr [rdi]
cmp rax, qword ptr [rsi]
sete al
ret
And thanks to recent improvements <https://reviews.llvm.org/D28637> in the
memcmp codegen, this can be made to work for all sizes.
Impact of the change
I’ve measured the change on std:pair/std::tuple. The pass typically makes
the code 2-3 times faster with code that’s typically 2-3x times smaller.
A more detailed description can be found here
<https://docs.google.com/document/d/1CKp8cIfURXbPLSap0jFio7LW4suzR10u5gX4RBV0k7c/edit#>
and a proof of concept can be seen here <https://reviews.llvm.org/D33987>.
Do you see any aspect of this that I may have missed?
For now I’ve implemented this as a separate pass. Would there be a better
way to integrate it?
Thanks !
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170607/ce3bb305/attachment.html>
More information about the llvm-dev
mailing list