<html><body>
<p><font size="2" face="sans-serif">Hi all,</font><br>
<br>
<font size="2" face="sans-serif">For PPC targets, FastISel does not take the sign extension information into account when selecting return instructions whose operands are constants. A consequence of this is that the return of boolean values is not correct. E.g. the following program would (erroneously) return 0:</font><br>
<br>
<font size="2" face="sans-serif">bool T(){</font><br>
<font size="2" face="sans-serif">     return true;</font><br>
<font size="2" face="sans-serif">}</font><br>
<br>
<font size="2" face="sans-serif">bool F(){</font><br>
<font size="2" face="sans-serif">     return !T();</font><br>
<font size="2" face="sans-serif">}</font><br>
<br>
<font size="2" face="sans-serif">inr main(){</font><br>
<font size="2" face="sans-serif">     if(F())</font><br>
<font size="2" face="sans-serif">             return 0;</font><br>
<font size="2" face="sans-serif">     else</font><br>
<font size="2" face="sans-serif">             return 1;</font><br>
<font size="2" face="sans-serif">}</font><br>
<br>
<font size="2" face="sans-serif">The reason the output of this program is wrong is that ‘true’ sign is sign to 64-bit (0xfff..fff) and the negation only flips the least significant bit. This code pattern is used in some Clang’s unit tests, and this is the reason they are failing for PowerPC when building clang with the latest clang. </font><br>
<br>
<font size="2" face="sans-serif">This patches fixes the problem by evaluating the sign extension information also for constants, forwarding this information to PPCMaterializeInt which takes this information to drive the sign extension during the materialization. </font><br>
<br>
<font size="2" face="sans-serif">The modified files are the following:</font><br>
<br>
<font size="2" face="sans-serif">lib/Target/PowerPC/PPCFastISel.cpp</font><br>
<font size="2" face="sans-serif">test/CodeGen/PowerPC/fast-isel-ret.ll</font><br>
<br>
<font size="2" face="sans-serif">Thanks,</font><br>
<br>
<font size="2" face="sans-serif">Sam</font><br>
<br>
<i>(See attached file: llvm_fsel_ret.patch)</i></body></html>