[LLVMdev] Regarding ARM CodeGen
Evan Cheng
evan.cheng at apple.com
Mon Jul 14 17:52:41 PDT 2008
On Jul 14, 2008, at 5:10 PM, kapil anand wrote:
> Hi Evan,
>
> Thanks for the answers. I had few more queries though.
>
> 1. As far as I was able to understand the Codegen infrastructure,
> ARMInstrInfo.td file has complete description of the instructions
> which modify the status flags. For example, we have description for
> both ADD and ADDS. But the problem is that in LLVM, we have a single
> "ADD" Instruction. Thus when we do getDesc(add), we get the
> descripiton corresponding to "ADD". When I was reading the code, I
> got a feeling that if we are able to modify this selection of "ADD"
> to "ADDS"( provided we somehow determine that we need ADDS here),
> then everything else related to ARM instruction generation has been
> handled in current infrastructure. Is this correct or do we need to
> modify other things also?
The short answer is we'll need to modify other things. It's possible
to custom lower setcc / select_cc, etc. to handle some the cases and
enable selection of ADDS. But it won't be a very generic fix. The
right fix is to add a pass to optimize away the cmp instruction by
*folding* it in the preceding add when it's legal. Ideally this will
be a target independent pass that x86 and other targets can take
advantage of as well.
>
>
> 2. In file ARMISelLowering.cpp, inside function FPCCtoARMCC,
> condition ISD::SETO generates ARMCC::VC ( Overflow clear) condition.
> Thus, if we are able to appropriately generate ISD::SETO inside
> SDNode for overflow clear and then map it to ARMCC::VC instruction
> in IntCCtoARMCC, then will that be enough to generate the an
> instruction like "addvc"?
addvc means "executing the add when overflow clear"? Then yes, that
will happen as a result of if conversion if the incoming instruction
selection input looks like that.
Evan
>
>
> Thanks
>
> Regards,
> Kapil Anand
>
> On Mon, Jul 14, 2008 at 6:10 PM, Evan Cheng <evan.cheng at apple.com>
> wrote:
>
> On Jul 14, 2008, at 12:59 PM, kapil anand wrote:
>
>> Hi all,
>>
>> I am using LLVM compiler and CodeGen for generating ARM binaries.
>>
>> I was going through the code for ARM backend. I noticed that the
>> ARM Condition field( Bits 31-28) is generated by converting the
>> conditions used in icmp and branch. For example, if I have
>> following C Code
>>
>> int a,b,c,d;
>> c = a+b;
>>
>> if(c==0)
>> d = a + 10;
>>
>>
>> Then I get ( Assembly Instructions with opcodes only)
>>
>> add
>> cmp
>> addeq
>>
>>
>> ( basically converting branch to the predicate condition field)
>>
>> I have a few questions regarding the above operation.
>> 1. If I use GCC on above code, then I get following .s output:
>> adds
>> addeq
>>
>> I don't get the intermediate compare instruction, which I got when
>> I used LLVM. So, does LLVM ARM Backend assume that only "cmp" and
>> "test" instructions can set the Status flags and not the usual
>> arithmetic instructions. Is there any way of specifying to Backend
>> that add can also modify status flag through "s" bit.
>
> Right. X86 backend has the same issue. It's not taking advantage of
> the fact that instructions can set the condition register bits. It's
> a known codegen deficiency. On x86 it's generally not a *huge* issue
> but I have no idea what its impact is on various ARM implementations.
>
>>
>>
>> 2. Also, when I looked at ISelLowering file, I noticed that
>> conditions used in "icmp" instructions are converted to ARM
>> Predicate Condition fields. Icmp has only "10" conditions, which
>> map to corresponding "10" conditions in ARM Condition field but ARM
>> can have fourteen conditions. If we consider the mapping shown in
>> ISelLowering File, then following four conditions are left:
>> "VS": Overflow Set
>> "VC" : Overflow Clear
>> "MI" : Minus
>> "PL": Plus
>>
>> So, does this mean that it is not possible to obtain the above
>> conditions are predicate if we use LLVM Compiler framework.
>
> It's not clear to me how those are modeled in the llvm level.
>
> Evan
>
>>
>>
>> Thanks
>>
>> Regards,
>> Kapil Anand
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080714/046b7b89/attachment.html>
More information about the llvm-dev
mailing list