[llvm-commits] [PATCH][code size][ARM] Emit regular call instructions instead of the move, branch sequence

Quentin Colombet qcolombet at apple.com
Fri Oct 26 17:21:14 PDT 2012


Hi Jim,

On Oct 26, 2012, at 4:58 PM, Jim Grosbach <grosbach at apple.com> wrote:

> Hi Quentin,
> 
> This looks good to me, with one very minor stylistic tweak below.
> 
> Regards,
>  Jim
> 
>> Index: lib/Target/ARM/ARMISelLowering.cpp
>> ===================================================================
>> --- lib/Target/ARM/ARMISelLowering.cpp	(revision 166831)
>> +++ lib/Target/ARM/ARMISelLowering.cpp	(working copy)
>> @@ -1594,11 +1594,14 @@
>> 
>>   // FIXME: handle tail calls differently.
>>   unsigned CallOpc;
>> +  Attributes FnAttributes = MF.getFunction()->getFnAttributes();
> 
> Since we're only using this to check for the force-size attribute, the code will probably read a bit more clearly if we just make a bool here for that. Something like:
> 
> bool HasForceSizeAttr = FnAttributes = MF.getFunction()->getFnAttributes().hasAttribute(Attributes::ForceSizeOpt);

Doing that I reach the 80 characters limit for a line.
What is the current accepted way of splitting this kind of long chain of method calls?

> 
>>   if (Subtarget->isThumb()) {
>>     if ((!isDirect || isARMFunc) && !Subtarget->hasV5TOps())
>>       CallOpc = ARMISD::CALL_NOLINK;
>>     else if (doesNotRet && isDirect && !isARMFunc &&
>> -             Subtarget->hasRAS() && !Subtarget->isThumb1Only())
>> +             Subtarget->hasRAS() && !Subtarget->isThumb1Only() &&
>> +	     // Emit regular call when code size is the priority
>> +	     !FnAttributes.hasAttribute(Attributes::ForceSizeOpt))
> 
> Then this simplifies to just reference the bool.
> 
> 
>>       // "mov lr, pc; b _foo" to avoid confusing the RSP
>>       CallOpc = ARMISD::CALL_NOLINK;
>>     else
>> @@ -1606,7 +1609,9 @@
>>   } else {
>>     if (!isDirect && !Subtarget->hasV5TOps()) {
>>       CallOpc = ARMISD::CALL_NOLINK;
>> -    } else if (doesNotRet && isDirect && Subtarget->hasRAS())
>> +    } else if (doesNotRet && isDirect && Subtarget->hasRAS() &&
>> +	       // Emit regular call when code size is the priority
>> +	       !FnAttributes.hasAttribute(Attributes::ForceSizeOpt))
>>       // "mov lr, pc; b _foo" to avoid confusing the RSP
>>       CallOpc = ARMISD::CALL_NOLINK;
>>     else
>> Index: test/CodeGen/ARM/call-noret-forsize.ll
>> ===================================================================
>> --- test/CodeGen/ARM/call-noret-forsize.ll	(revision 0)
>> +++ test/CodeGen/ARM/call-noret-forsize.ll	(revision 0)
>> @@ -0,0 +1,34 @@
>> +; RUN: llc < %s -mtriple=armv7-apple-ios -mcpu=cortex-a8   | FileCheck %s -check-prefix=ARM
>> +; RUN: llc < %s -mtriple=armv7-apple-ios -mcpu=swift       | FileCheck %s -check-prefix=SWIFT
>> +; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 | FileCheck %s -check-prefix=T2
>> +; rdar://12348580
>> +
>> +define void @t1() noreturn forcesizeopt nounwind ssp {
>> +entry:
>> +; ARM: t1:
>> +; ARM: bl _bar
>> +
>> +; SWIFT: t1:
>> +; SWIFT: bl _bar
>> +
>> +; T2: t1:
>> +; T2: blx _bar
>> +  tail call void @bar() noreturn nounwind
>> +  unreachable
>> +}
>> +
>> +define void @t2() noreturn forcesizeopt nounwind ssp {
>> +entry:
>> +; ARM: t2:
>> +; ARM: bl _t1
>> +
>> +; SWIFT: t2:
>> +; SWIFT: bl _t1
>> +
>> +; T2: t2:
>> +; T2: bl _t1
>> +  tail call void @t1() noreturn nounwind
>> +  unreachable
>> +}
>> +
>> +declare void @bar() noreturn
> 
> On Oct 26, 2012, at 4:39 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
>> Hi,
>> 
>> Attached a patch to generate a cheaper sequence of code for calls on ARM when the code size is the main concern.
>> 
>> Quentin
>> 
>> <ARMISelLowering.patch>_______________________________________________
>> 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