[llvm-commits] [llvm] r48356 - /llvm/trunk/lib/Target/X86/README.txt
Evan Cheng
evan.cheng at apple.com
Mon Mar 17 11:33:13 PDT 2008
For the sake of argument:
ARM:
_test:
mov r3, r0, lsr #16
sxtb r0, r3
bx lr
_test2:
mov r3, r0, lsl #8
mov r0, r3, asr #24
bx lr
PPC32:
_test:
srwi r2, r3, 16
extsb r3, r2
blr
_test2:
slwi r2, r3, 8
srawi r3, r2, 24
blr
Don't diss x86! :-)
Evan
On Mar 14, 2008, at 10:34 AM, Chris Lattner wrote:
> On Mar 14, 2008, at 10:15 AM, Evan Cheng wrote:
>> This seems like a target independent dag combiner xform?
>
> Turning the first into the second is target independent, and should
> actually be done in instcombine. The problem is that the second one
> generates worse code from the x86 backend than the first one.
>
> On PPC and ARM, they generate equally good code (on ARM they both
> compile to identical instructions even) so consider this to be "X86
> generates inefficient code for:
>
> define i32 @test2(i32 %f12) {
> %f11 = shl i32 %f12, 8
> %tmp7.25 = ashr i32 %f11, 24
> ret i32 %tmp7.25
> }"
>
> :)
>
> -Chris
>
>
>> On Mar 13, 2008, at 11:00 PM, Chris Lattner wrote:
>>
>>>
>>>
>>> +These two functions perform identical operations:
>>> +
>>> +define i32 @test(i32 %f12) {
>>> + %tmp7.25 = lshr i32 %f12, 16
>>> + %tmp7.26 = trunc i32 %tmp7.25 to i8
>>> + %tmp78.2 = sext i8 %tmp7.26 to i32
>>> + ret i32 %tmp78.2
>>> +}
>>> +
>>> +define i32 @test2(i32 %f12) {
>>> + %f11 = shl i32 %f12, 8
>>> + %tmp7.25 = ashr i32 %f11, 24
>>> + ret i32 %tmp7.25
>>> +}
>>> +
>>> +but the first compiles into significantly better code on x86-32:
>>> +
>>> +_test:
>>> + movsbl 6(%esp), %eax
>>> + ret
>>> +_test2:
>>> + movl 4(%esp), %eax
>>> + shll $8, %eax
>>> + sarl $24, %eax
>>> + ret
>>> +
>>> +and on x86-64:
>>> +
>>> +_test:
>>> + shrl $16, %edi
>>> + movsbl %dil, %eax
>>> + ret
>>> +_test2:
>>> + shll $8, %edi
>>> + movl %edi, %eax
>>> + sarl $24, %eax
>>> + ret
>>> +
>>> +I would like instcombine to canonicalize the first into the second
>>> (since it is
>>> +shorter and doesn't involve type width changes) but the x86 backend
>>> needs to do
>>> +the right thing with the later sequence first.
>>> +
>>> +//
>>> =
>>> =
>>> =
>>> ---------------------------------------------------------------------
>>> ===//
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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