[llvm] r185712 - ARM: Fix incorrect pack pattern

Arnold Schwaighofer aschwaighofer at apple.com
Fri Jul 5 11:48:29 PDT 2013


An asr of 16 to 31. I’ll add that in a sec.


On Jul 5, 2013, at 1:37 PM, Jim Grosbach <grosbach at apple.com> wrote:

> Would we not also want to add a pattern which matches an arithmetic shift of [17..31]?
> 
> -Jim
> 
> On Jul 5, 2013, at 11:28 AM, Arnold Schwaighofer <aschwaighofer at apple.com> wrote:
> 
>> Author: arnolds
>> Date: Fri Jul  5 13:28:39 2013
>> New Revision: 185712
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=185712&view=rev
>> Log:
>> ARM: Fix incorrect pack pattern
>> 
>> A "pkhtb x, x, y asr #num" uses the lower 16 bits of "y asr #num" and packs them
>> in the bottom half of "x". An arithmetic and logic shift are only equivalent in
>> this context if the shift amount is 16. We would be shifting in ones into the
>> bottom 16bits instead of zeros if "y" is negative.
>> 
>> radar://14338767
>> 
>> Modified:
>>    llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
>>    llvm/trunk/test/CodeGen/ARM/pack.ll
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMInstrInfo.td
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrInfo.td?rev=185712&r1=185711&r2=185712&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMInstrInfo.td (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMInstrInfo.td Fri Jul  5 13:28:39 2013
>> @@ -4011,9 +4011,11 @@ def PKHTB : APKHI<0b01101000, 1, (outs G
>> 
>> // Alternate cases for PKHTB where identities eliminate some nodes.  Note that
>> // a shift amount of 0 is *not legal* here, it is PKHBT instead.
>> +// We also can not replace a srl (17..31) by an arithmetic shift we would use in
>> +// pkhtb src1, src2, asr (17..31).
>> def : ARMV6Pat<(or (and GPRnopc:$src1, 0xFFFF0000),
>> -                   (srl GPRnopc:$src2, imm16_31:$sh)),
>> -               (PKHTB GPRnopc:$src1, GPRnopc:$src2, imm16_31:$sh)>;
>> +                   (srl GPRnopc:$src2, imm16:$sh)),
>> +               (PKHTB GPRnopc:$src1, GPRnopc:$src2, imm16:$sh)>;
>> def : ARMV6Pat<(or (and GPRnopc:$src1, 0xFFFF0000),
>>                    (and (srl GPRnopc:$src2, imm1_15:$sh), 0xFFFF)),
>>                (PKHTB GPRnopc:$src1, GPRnopc:$src2, imm1_15:$sh)>;
>> 
>> Modified: llvm/trunk/test/CodeGen/ARM/pack.ll
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/pack.ll?rev=185712&r1=185711&r2=185712&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/ARM/pack.ll (original)
>> +++ llvm/trunk/test/CodeGen/ARM/pack.ll Fri Jul  5 13:28:39 2013
>> @@ -78,11 +78,24 @@ define i32 @test7(i32 %X, i32 %Y) {
>> 	ret i32 %tmp57
>> }
>> 
>> +; Arithmetic and logic right shift does not have the same semantics if shifting
>> +; by more than 16 in this context.
>> +
>> ; CHECK: test8
>> -; CHECK: pkhtb   r0, r0, r1, asr #22
>> +; CHECK-NOT: pkhtb   r0, r0, r1, asr #22
>> define i32 @test8(i32 %X, i32 %Y) {
>> 	%tmp1 = and i32 %X, -65536
>> 	%tmp3 = lshr i32 %Y, 22
>> 	%tmp57 = or i32 %tmp3, %tmp1
>> 	ret i32 %tmp57
>> }
>> +
>> +; CHECK: test9:
>> +; CHECK: pkhtb r0, r0, r1, asr #16
>> +define i32 @test9(i32 %src1, i32 %src2) {
>> +entry:
>> +    %tmp = and i32 %src1, -65536
>> +    %tmp2 = lshr i32 %src2, 16
>> +    %tmp3 = or i32 %tmp, %tmp2
>> +    ret i32 %tmp3
>> +}
>> 
>> 
>> _______________________________________________
>> 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