[llvm-commits] [llvm] r164138 - in /llvm/trunk: lib/Target/PowerPC/PPCISelLowering.cpp test/CodeGen/PowerPC/ppc64-calls.ll

Roman Divacky rdivacky at freebsd.org
Tue Sep 18 09:51:25 PDT 2012


I think that after this we can remove 

test/CodeGen/PowerPC/bl8_elf_nop.ll
test/CodeGen/PowerPC/ppc64-ind-call.ll


On Tue, Sep 18, 2012 at 04:47:58PM -0000, Roman Divacky wrote:
> Author: rdivacky
> Date: Tue Sep 18 11:47:58 2012
> New Revision: 164138
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=164138&view=rev
> Log:
> Optimize local func calls to not emit nop for TOC restoration.
> 
> Patch by Adhemerval Zanella.
> 
> Added:
>     llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll
> Modified:
>     llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> 
> Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=164138&r1=164137&r2=164138&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Tue Sep 18 11:47:58 2012
> @@ -2808,6 +2808,14 @@
>    return CallOpc;
>  }
>  
> +static
> +bool isLocalCall(const SDValue &Callee)
> +{
> +  if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
> +    return !G->getGlobal()->isDeclaration();
> +  return false;
> +}
> +
>  SDValue
>  PPCTargetLowering::LowerCallResult(SDValue Chain, SDValue InFlag,
>                                     CallingConv::ID CallConv, bool isVarArg,
> @@ -2916,8 +2924,8 @@
>        // from allocating it), resulting in an additional register being
>        // allocated and an unnecessary move instruction being generated.
>        needsTOCRestore = true;
> -    } else if (CallOpc == PPCISD::CALL_SVR4) {
> -      // Otherwise insert NOP.
> +    } else if ((CallOpc == PPCISD::CALL_SVR4) && !isLocalCall(Callee)) {
> +      // Otherwise insert NOP for non-local calls.
>        CallOpc = PPCISD::CALL_NOP_SVR4;
>      }
>    }
> 
> Added: llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll?rev=164138&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll (added)
> +++ llvm/trunk/test/CodeGen/PowerPC/ppc64-calls.ll Tue Sep 18 11:47:58 2012
> @@ -0,0 +1,49 @@
> +; RUN: llc < %s -march=ppc64 | FileCheck %s
> +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
> +target triple = "powerpc64-unknown-linux-gnu"
> +
> +define void @foo() nounwind readnone noinline {
> +  ret void
> +}
> +
> +; Calls to local function does not require the TOC restore 'nop'
> +define void @test_direct() nounwind readnone {
> +; CHECK: test_direct:
> +  tail call void @foo() nounwind
> +; CHECK: bl foo
> +; CHECK-NOT: nop
> +  ret void
> +}
> +
> +; Indirect calls requires a full stub creation
> +define void @test_indirect(void ()* nocapture %fp) nounwind {
> +; CHECK: test_indirect:
> +  tail call void %fp() nounwind
> +; CHECK: ld [[FP:[0-9]+]], 0(3)
> +; CHECK: ld 11, 16(3)
> +; CHECK: ld 2, 8(3)
> +; CHECK-NEXT: mtctr [[FP]]
> +; CHECK-NEXT: bctrl
> +; CHECK-NEXT: ld 2, 40(1)
> +  ret void
> +}
> +
> +; Absolute vales should be have the TOC restore 'nop'
> +define void @test_abs() nounwind {
> +; CHECK: test_abs:
> +  tail call void inttoptr (i64 1024 to void ()*)() nounwind
> +; CHECK: bla 1024
> +; CHECK-NEXT: nop
> +  ret void
> +}
> +
> +declare double @sin(double) nounwind
> +
> +; External functions call should also have a 'nop'
> +define double @test_external(double %x) nounwind {
> +; CHECK: test_external:
> +  %call = tail call double @sin(double %x) nounwind
> +; CHECK: bl sin
> +; CHECK-NEXT: nop
> +  ret double %call
> +}
> 
> 
> _______________________________________________
> 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