<div dir="ltr"><div dir="ltr">Consider the following x86_64 assembly:<br>cmpl   $0x12,%rax<br>sbb    %esi,%esi<br>and    $0xffffffffffffffdf,%esi<br>add    $0x5b,%esi<br>It contains the SBB instruction. SBB cannot be represented in LLVM_IR<br>cmpl: if ($0x12 < %rax) set the carry flag.<br>sbb: if carry flag set: %esi = 0xffffffffffffffff else %esi = 0;    // Note: 0xffffffffffffffff = -1<br>and: if carry flag set: %esi = 0xffffffffffffffdf else %esi = 0;    // Note: 0xffffffffffffffdf = -33<br>add: if carry flag set: %esi = 0x3a else %esi = 0x5b;<br>This can then be converted into:<br>if ($0x12 < %rax) {<br>        %esi = 58;  // 0x3a<br>} else {<br>        %esi = 91;  // 0x5b<br>}<br>So, the SBB is used here to remove the need for a Branch instruction.<br>WOW, compilers are clever!!!</div><div dir="ltr"><br></div><div>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.<br></div><div>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.</div><div>The above being one example.</div><div>For example:</div><div>1) List all optimizations that result in a SBB instruction.</div><div><br></div><div>Where in LLVM should I start looking ?</div><div><br></div><div>Kind Regards</div><div><br></div><div>James</div><div><br></div></div>