[llvm-commits] Add -arm-long-calls support for ARMFastISel
Chad Rosier
mcrosier at apple.com
Tue Jun 12 12:27:12 PDT 2012
Thanks, Jush. Committed revision 158368.
Chad
On Jun 12, 2012, at 1:00 AM, Jush Lu wrote:
> Hi Chad,
>
> The new patch is attached, I moved the BuildMI out the if-else, so
> that BuildMI will be called only once.
>
> I also moved some duplicate code into a new private function
> "getLibcallReg(const Twin &Name)".
>
> Thanks,
> Jush
>
>
> On Tue, Jun 12, 2012 at 3:54 AM, Chad Rosier <mcrosier at apple.com> wrote:
>> Hi Jush,
>> Overall, LGTM. When the call is emitted in EmitLibcall is there a difference in the logic when in ARM mode vs. Thumb?
>>
>> Specifically, this bit of logic:
>> // Issue the call.
>> MachineInstrBuilder MIB;
>> unsigned CallOpc = ARMSelectCallOp(EnableARMLongCalls);
>> if (isThumb2) {
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc)));
>> if (EnableARMLongCalls)
>> MIB.addReg(CalleeReg);
>> else
>> MIB.addExternalSymbol(TLI.getLibcallName(Call));
>> } else {
>> if (EnableARMLongCalls)
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc))
>> .addReg(CalleeReg));
>> else
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc))
>> .addExternalSymbol(TLI.getLibcallName(Call)));
>> }
>>
>> Similarly, in EmitCall can the logic in the else clause be simplified like that in the if (isThumb2) clause? Specifically, can you make a single call to BuildMI in the else clause for this bit of logic:
>>
>> // Issue the call.
>> MachineInstrBuilder MIB;
>> unsigned CallOpc = ARMSelectCallOp(UseReg);
>> if(isThumb2) {
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc)));
>> if (UseReg)
>> MIB.addReg(CalleeReg);
>> else if (!IntrMemName)
>> MIB.addGlobalAddress(GV, 0, 0);
>> else
>> MIB.addExternalSymbol(IntrMemName, 0);
>> } else {
>> if (UseReg)
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc))
>> .addReg(CalleeReg));
>> else if (!IntrMemName)
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc))
>> .addGlobalAddress(GV, 0, 0));
>> else
>> // Explicitly adding the predicate here.
>> MIB = AddDefaultPred(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>> TII.get(CallOpc))
>> .addExternalSymbol(IntrMemName, 0));
>> }
>>
>>
>> Chad
>>
>> On Jun 10, 2012, at 7:59 AM, Jush Lu wrote:
>>
>>> Hi,
>>>
>>> I removed some unnecessary variables from the patch in last mail,
>>> please ignore the patch in the last mail, and use the new one attached
>>> in this mail.
>>>
>>> Thanks,
>>> Jush
>>>
>>> On Sun, Jun 10, 2012 at 9:30 AM, Jush Lu <jush.msn at gmail.com> wrote:
>>>> Hi,
>>>>
>>>> This patch adds -arm-long-calls support for ARMFastISel.
>>>>
>>>> It can generate arm long calls for global functions, runtime library
>>>> calls, and memory intrinsics such as llvm.memset.
>>>>
>>>> The testtcases in the patch show how they work. Basically, these long
>>>> calls work by blx instructions as the call to non-global callee does
>>>> in r157336.
>>>>
>>>> Please help me review, thanks.
>>>>
>>>> Thanks,
>>>> Jush
>>> <ARMFastISel-arm-long-calls.patch>
>>
> <ARMFastISel-arm-long-calls-06-12.patch>
More information about the llvm-commits
mailing list