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

Hal Finkel hfinkel at anl.gov
Tue Sep 18 10:55:03 PDT 2012


On Tue, 18 Sep 2012 18:51:25 +0200
Roman Divacky <rdivacky at freebsd.org> wrote:

> I think that after this we can remove 
> 
> test/CodeGen/PowerPC/bl8_elf_nop.ll
> test/CodeGen/PowerPC/ppc64-ind-call.ll

Seems that way; please do!

Thanks again,
Hal

> 
> 
> 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
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
Hal Finkel
Postdoctoral Appointee
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list