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

Jim Grosbach grosbach at apple.com
Fri Oct 26 16:58:46 PDT 2012


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);

>    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