<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-family: Verdana,Geneva,sans-serif'>
<p>I gave the following function to IAR compiler (targeting CortexM0) and to clang/LLVM 3.2 (clang -O3 -target thumbv6-eabi -emit-llvm)</p>
<p>int calleeSave8(int in[]){<br />    int out=0;<br />    int i;<br />    for(i=0;i<8;i++){<br />        out ^= in[i] & in[(i+1)%8];<br />    }//expand to out = (in[0]&in[1])^(in[1]&in[2])^(in[2]&in[3])^(in[3]&in[4])^(in[4]&in[5])^(in[5]&in[6])^(in[6]&in[7])^(in[7]&in[0])    <br />    return out;<br />}</p>
<p>In such case, IAR compiler is able to factor out half of the and operations so it performs 4 and + 7 xor, LLVM factored only one and operation so it performs 7 and + 7 xor. (I looked at IR code and assembly output)</p>
<p>Did I miss some option that would improve the result ?</p>
<p>My understanding is that this kind of optimization should be done by the target independent part of the code generator, backends should not have to implement such optimization right ?</p>
<p>Cheers,</p>
<p>Sebastien</p>
<div> </div>
</body></html>