[llvm-dev] Understanding optimizations below LLVM IR.

James Courtier-Dutton via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 2 08:42:10 PDT 2018


Consider the following x86_64 assembly:
cmpl   $0x12,%rax
sbb    %esi,%esi
and    $0xffffffffffffffdf,%esi
add    $0x5b,%esi
It contains the SBB instruction. SBB cannot be represented in LLVM_IR
cmpl: if ($0x12 < %rax) set the carry flag.
sbb: if carry flag set: %esi = 0xffffffffffffffff else %esi = 0;    //
Note: 0xffffffffffffffff = -1
and: if carry flag set: %esi = 0xffffffffffffffdf else %esi = 0;    //
Note: 0xffffffffffffffdf = -33
add: if carry flag set: %esi = 0x3a else %esi = 0x5b;
This can then be converted into:
if ($0x12 < %rax) {
        %esi = 58;  // 0x3a
} else {
        %esi = 91;  // 0x5b
}
So, the SBB is used here to remove the need for a Branch instruction.
WOW, compilers are clever!!!

I am writing a de-compiler "Binary -> LLVM IR". So, I obviously need to
treat SBB as a special case and transform it into something that can be
represented in LLVM IR.
I wish to obtain a list of all the optimizations done by LLVM that result
in assembly that cannot immediately be represented in LLVM IR.
The above being one example.
For example:
1) List all optimizations that result in a SBB instruction.

Where in LLVM should I start looking ?

Kind Regards

James
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180902/45247711/attachment.html>


More information about the llvm-dev mailing list