[llvm-commits] [PATCH, instcombine] X ^ Y -> X or Y
Shuxin Yang
shuxin.llvm at gmail.com
Tue Dec 4 16:35:46 PST 2012
Thank you for figuring out this typo.
Fixed in r169345.
On 12/4/12 4:25 PM, Sean Silva wrote:
> +; unsigned foo(unsigned x) { nsigned t = x ^ 1234; ; return (t >> 16) + t;}
>
> typo 'nsigned'
>
> -- Sean Silva
>
> On Tue, Dec 4, 2012 at 5:07 PM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
>> Hi,
>>
>> For rdar://12329730, last piece.
>>
>> This change attempts to simplify (X^Y) -> X or Y in the user's context if
>> we know that
>> only bits from X or Y are demanded.
>>
>> A minimized case is provided bellow. This change will simplify "t>>9"
>> into "var1 >>9".
>>
>> ==============================
>> unsigned foo (unsigned val1, unsigned val2) {
>> unsigned t = val1 ^ 1234;
>> return (t >> 16) | t; // NOTE: t is used more than once.
>> }
>> ===============================
>>
>> Note that if the "t" were used only once, the expression would be finally
>> optimized as well.
>> However, with with this change, the optimization will take place earlier.
>>
>> The change to test39 at shift.ll is not obvious. We can verify the
>> correctness by
>> starting tmp4 with value {b7, b6, ... b0} (NOTE: tmp4 is of type i8).
>>
>> Thank you for review
>> Shuxin
>>
>> test39 WAS:
>> ========
>> define i8 @test39(i32 %a0) {
>> entry:
>> %tmp4 = trunc i32 %a0 to i8
>> %tmp5 = shl i8 %tmp4, 5
>> %tmp49 = shl i8 %tmp4, 6
>> %tmp50 = and i8 %tmp49, 64
>> %tmp51 = xor i8 %tmp50, %tmp5
>> %tmp53 = lshr i8 %tmp51, 7
>> %tmp54 = shl nuw nsw i8 %tmp53, 4
>> %tmp551 = or i8 %tmp54, %tmp51
>> ret i8 %tmp551
>> }
>>
>> IS:
>> ===
>> define i8 @test39(i32 %a0) {
>> entry:
>> %tmp4 = trunc i32 %a0 to i8
>> %tmp5 = shl i8 %tmp4, 5
>> %tmp49 = shl i8 %tmp4, 6
>> %tmp50 = and i8 %tmp49, 64
>> %tmp51 = xor i8 %tmp50, %tmp5
>> %0 = shl i8 %tmp4, 2 ; **** diff **
>> %tmp54 = and i8 %0, 16 ; **** diff **
>> %tmp551 = or i8 %tmp54, %tmp51
>> ret i8 %tmp551
>> }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
More information about the llvm-commits
mailing list