[llvm-dev] Understanding optimizations below LLVM IR. (original) (raw)
James Courtier-Dutton via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 2 08:42:10 PDT 2018
- Previous message: [llvm-dev] Replacing a function from one module into another one
- Next message: [llvm-dev] Understanding optimizations below LLVM IR.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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:
- 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>
- Previous message: [llvm-dev] Replacing a function from one module into another one
- Next message: [llvm-dev] Understanding optimizations below LLVM IR.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]