diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-12-03 07:15:55 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-12-03 07:15:55 +0000 |
| commit | ecfc7e56c53cca2282c36c224f73147a4626911e (patch) | |
| tree | c32104a81fd80de982d83582cb848ea34d0a3da4 | |
| parent | 5d7a0a3aeeceab8850a40f4151117bbf11d93fe0 (diff) | |
| download | bcm5719-llvm-ecfc7e56c53cca2282c36c224f73147a4626911e.tar.gz bcm5719-llvm-ecfc7e56c53cca2282c36c224f73147a4626911e.zip | |
Fix test/Regression/ExecutionEngine/2005-12-02-TailCallBug.ll and PR672.
This also fixes 177.mesa, the only program that fails with --enable-x86-fastcc
turned on. Given a clean nightly tester run, we should be able to turn it
on by default!
llvm-svn: 24578
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelPattern.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelPattern.cpp b/llvm/lib/Target/X86/X86ISelPattern.cpp index 5c4594aa9ec..28f799ee4a8 100644 --- a/llvm/lib/Target/X86/X86ISelPattern.cpp +++ b/llvm/lib/Target/X86/X86ISelPattern.cpp @@ -3067,6 +3067,20 @@ void ISel::EmitFastCCToFastCCTailCall(SDNode *TailCallNode) { // TODO: handle jmp [mem] if (!isDirect) { + // We do not want the register allocator to allocate CalleeReg to a callee + // saved register, as these will be restored before the JMP. To prevent + // this, emit explicit clobbers of callee saved regs here. A better way to + // solve this would be to specify that the register constraints of TAILJMPr + // only allow registers that are not callee saved, but we currently can't + // express that. This forces all four of these regs to be saved and + // reloaded for all functions with an indirect tail call. + // TODO: Improve this! + BuildMI(BB, X86::IMPLICIT_DEF, 4) + .addReg(X86::ESI, MachineOperand::Def) + .addReg(X86::EDI, MachineOperand::Def) + .addReg(X86::EBX, MachineOperand::Def) + .addReg(X86::EBP, MachineOperand::Def); + BuildMI(BB, X86::TAILJMPr, 1).addReg(CalleeReg); } else if (GlobalAddressSDNode *GASD = dyn_cast<GlobalAddressSDNode>(Callee)){ BuildMI(BB, X86::TAILJMPd, 1).addGlobalAddress(GASD->getGlobal(), true); |

