diff options
author | Akira Hatanaka <ahatanaka@mips.com> | 2012-10-27 00:56:56 +0000 |
---|---|---|
committer | Akira Hatanaka <ahatanaka@mips.com> | 2012-10-27 00:56:56 +0000 |
commit | 21a9a98b77c48fb5084d3ef470083704d13c3929 (patch) | |
tree | a48d655cd40d51fb5147ac11d837c4929348b8ec /lib/Target/Mips/MipsISelLowering.cpp | |
parent | 4618e0b574bf879d062a39b5867d9c314a4639e0 (diff) |
[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
Diffstat (limited to 'lib/Target/Mips/MipsISelLowering.cpp')
-rw-r--r-- | lib/Target/Mips/MipsISelLowering.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
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; |