I recently downloaded LLVM 2.8 and started playing with the optimizations a bit.<div>I saw something curious while trying the following function:</div><div><br></div><div><div>int g(unsigned int a) {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>unsigned int c[100];</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>c[10] = a;<span class="Apple-tab-span" style="white-space:pre">  </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>c[11] = a;</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>unsigned int b = c[10] + c[11];</div><div><span class="Apple-tab-span" style="white-space:pre">      </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>if(b > a*2) a = 4; </div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>else a = 8;</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>return a + 7;</div><div>}</div></div><div><br></div><div>The generated code, with -O3 activated, is</div>
<div><br></div><div>define i32 @g(i32 a) nounwind readnone {</div><div>       %add = shl i32 %a, 1</div><div>       %mul = shl i32 %a, 1</div><div>       %cmp = icmp ugt i32 %add, %mul</div><div>       %a.addr.0 = select i1 %cmp, i32 11, i32 15</div>
<div>       ret i32 %a.addr.0</div><div>}</div><div><br></div><div>I find it strange that it hasn't found that %add and %mul have the same value, %cmp would be then false, selecting and returning 15. If 'a' is replaced by a constant it works.</div>
<div><br></div><div>I'm also curios which pass detects that c[10] and c[11] are 'a' in 'b = c[10] + c[11]' (it isn't instcombine, at -O1 getelementptr/load are still there).</div>