diff --git a/lib/Target/Sparc/SparcISelLowering.cpp b/lib/Target/Sparc/SparcISelLowering.cpp index ef215390020..c2e16fc2199 100644 --- a/lib/Target/Sparc/SparcISelLowering.cpp +++ b/lib/Target/Sparc/SparcISelLowering.cpp @@ -1035,6 +1035,9 @@ SparcTargetLowering::LowerCall_64(TargetLowering::CallLoweringInfo &CLI, SDLoc DL = CLI.DL; SDValue Chain = CLI.Chain; + // Sparc target does not yet support tail call optimization. + CLI.IsTailCall = false; + // Analyze operands of the call, assigning locations to each operand. SmallVector ArgLocs; CCState CCInfo(CLI.CallConv, CLI.IsVarArg, DAG.getMachineFunction(), diff --git a/test/CodeGen/SPARC/2011-01-11-Call.ll b/test/CodeGen/SPARC/2011-01-11-Call.ll index 7350e923242..a0f478e119a 100644 --- a/test/CodeGen/SPARC/2011-01-11-Call.ll +++ b/test/CodeGen/SPARC/2011-01-11-Call.ll @@ -1,4 +1,24 @@ ; RUN: llc -march=sparc -O0 <%s +; RUN: llc -march=sparc <%s | FileCheck %s --check-prefix=V8 +; RUN: llc -march=sparcv9 <%s | FileCheck %s --check-prefix=V9 + +; V8-LABEL: test +; V8: save %sp +; V8: call foo +; V8-NEXT: nop +; V8: call bar +; V8-NEXT: nop +; V8: jmp %i7+8 +; V8-NEXT: restore + +; V9-LABEL: test +; V9: save %sp +; V9: call foo +; V9-NEXT: nop +; V9: call bar +; V9-NEXT: nop +; V9: jmp %i7+8 +; V9-NEXT: restore define void @test() nounwind { entry: @@ -11,3 +31,23 @@ declare i32 @foo(...) declare void @bar(...) + +; V8-LABEL: test_tail_call_with_return +; V8: save %sp +; V8: call foo +; V8-NEXT: nop +; V8: jmp %i7+8 +; V8-NEXT: restore %g0, %o0, %o0 + +; V9-LABEL: test_tail_call_with_return +; V9: save %sp +; V9: call foo +; V9-NEXT: nop +; V9: jmp %i7+8 +; V9-NEXT: restore %g0, %o0, %o0 + +define i32 @test_tail_call_with_return() nounwind { +entry: + %0 = tail call i32 (...)* @foo() nounwind + ret i32 %0 +}