aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-02-23 01:11:26 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-02-23 01:11:26 +0000
commit49dd06461a7e027a6c938f0570297d46f2f34218 (patch)
tree0cfbbb4ae7ef663128cea8d83c7e5db138a87478
parent0fa1b6d1b1ce5437c30585baddcba20e691d31e0 (diff)
downloadexternal_llvm-49dd06461a7e027a6c938f0570297d46f2f34218.zip
external_llvm-49dd06461a7e027a6c938f0570297d46f2f34218.tar.gz
external_llvm-49dd06461a7e027a6c938f0570297d46f2f34218.tar.bz2
First potential client of register scavenger.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34516 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/PrologEpilogInserter.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/CodeGen/PrologEpilogInserter.cpp b/lib/CodeGen/PrologEpilogInserter.cpp
index d81ec8b..5318ce5 100644
--- a/lib/CodeGen/PrologEpilogInserter.cpp
+++ b/lib/CodeGen/PrologEpilogInserter.cpp
@@ -20,6 +20,7 @@
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
+#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/MRegisterInfo.h"
#include "llvm/Target/TargetFrameInfo.h"
@@ -231,10 +232,12 @@ void PEI::saveCalleeSavedRegisters(MachineFunction &Fn) {
MachineBasicBlock::iterator I = MBB->begin();
if (!RegInfo->spillCalleeSavedRegisters(*MBB, I, CSI)) {
for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
+ // Add the callee-saved register as live-in. It's killed at the spill.
+ MBB->addLiveIn(CSI[i].getReg());
+
// Insert the spill to the stack frame.
RegInfo->storeRegToStackSlot(*MBB, I, CSI[i].getReg(),
- CSI[i].getFrameIdx(),
- CSI[i].getRegClass());
+ CSI[i].getFrameIdx(), CSI[i].getRegClass());
}
}
@@ -440,8 +443,9 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
const MRegisterInfo &MRI = *TM.getRegisterInfo();
- for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
- for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
+ for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
+ RegScavenger RS(BB);
+ for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
if (I->getOperand(i).isFrameIndex()) {
// If this instruction has a FrameIndex operand, we need to use that
@@ -449,4 +453,9 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
MRI.eliminateFrameIndex(I);
break;
}
+ // Update register states.
+ if (MRI.requiresRegisterScavenging())
+ RS.forward();
+ }
+ }
}