From 21a9a98b77c48fb5084d3ef470083704d13c3929 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka Date: Sat, 27 Oct 2012 00:56:56 +0000 Subject: [mips] Do not tail-call optimize vararg functions or functions with byval arguments. This is rather conservative and should be fixed later to be more aggressive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166851 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsISelLowering.cpp | 14 ++++++-------- lib/Target/Mips/MipsISelLowering.h | 3 ++- 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index 02674f5d05..94e18689b7 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -2639,19 +2639,16 @@ static unsigned getNextIntArgReg(unsigned Reg) { /// IsEligibleForTailCallOptimization - Check whether the call is eligible /// for tail call optimization. bool MipsTargetLowering:: -IsEligibleForTailCallOptimization(CallingConv::ID CalleeCC, +IsEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, bool IsVarArg, unsigned NextStackOffset) const { if (!EnableMipsTailCalls) return false; - // Do not tail-call optimize if there is an argument passed on stack. - if (IsO32 && (CalleeCC != CallingConv::Fast)) { - if (NextStackOffset > 16) - return false; - } else if (NextStackOffset) + if (MipsCCInfo.hasByValArg() || IsVarArg) return false; - return true; + // Return true if no arguments are passed on stack. + return MipsCCInfo.reservedArgArea() == NextStackOffset; } /// LowerCall - functions arguments are copied from virtual regs to @@ -2690,7 +2687,8 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, // Check if it's really possible to do a tail call. if (isTailCall) - isTailCall = IsEligibleForTailCallOptimization(CallConv, NextStackOffset); + isTailCall = IsEligibleForTailCallOptimization(MipsCCInfo, isVarArg, + NextStackOffset); if (isTailCall) ++NumTailCalls; diff --git a/lib/Target/Mips/MipsISelLowering.h b/lib/Target/Mips/MipsISelLowering.h index 160349e4aa..9e8c659829 100644 --- a/lib/Target/Mips/MipsISelLowering.h +++ b/lib/Target/Mips/MipsISelLowering.h @@ -274,7 +274,8 @@ namespace llvm { /// IsEligibleForTailCallOptimization - Check whether the call is eligible /// for tail call optimization. - bool IsEligibleForTailCallOptimization(CallingConv::ID CalleeCC, + bool IsEligibleForTailCallOptimization(const MipsCC &MipsCCInfo, + bool IsVarArg, unsigned NextStackOffset) const; /// copyByValArg - Copy argument registers which were used to pass a byval -- cgit v1.2.3