summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-05-12 18:46:03 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-05-12 18:46:03 +0000
commit804291e31658d46fb1db5ecaf42b31950c02a6f2 (patch)
tree00887deba6b7d40b21750b60efe41ca5bcbd9618 /lib
parentcacd5d3b172695cfadc2a405da68bc33af1dcfb8 (diff)
downloadllvm-804291e31658d46fb1db5ecaf42b31950c02a6f2.tar.gz
llvm-804291e31658d46fb1db5ecaf42b31950c02a6f2.tar.bz2
llvm-804291e31658d46fb1db5ecaf42b31950c02a6f2.tar.xz
Make sure to add kill flags to the last use of a virtreg when it is redefined.
The X86 floating point stack pass and others depend on good kill flags. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103635 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/RegAllocFast.cpp34
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/CodeGen/RegAllocFast.cpp b/lib/CodeGen/RegAllocFast.cpp
index a481f787dc..eac8407fff 100644
--- a/lib/CodeGen/RegAllocFast.cpp
+++ b/lib/CodeGen/RegAllocFast.cpp
@@ -121,8 +121,9 @@ namespace {
bool runOnMachineFunction(MachineFunction &Fn);
void AllocateBasicBlock(MachineBasicBlock &MBB);
int getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC);
- void killVirtReg(unsigned VirtReg);
+ void addKillFlag(LiveRegMap::iterator i);
void killVirtReg(LiveRegMap::iterator i);
+ void killVirtReg(unsigned VirtReg);
void spillVirtReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
unsigned VirtReg, bool isKill);
void killPhysReg(unsigned PhysReg);
@@ -161,20 +162,27 @@ int RAFast::getStackSpaceFor(unsigned VirtReg, const TargetRegisterClass *RC) {
return FrameIdx;
}
-/// killVirtReg - Mark virtreg as no longer available.
-void RAFast::killVirtReg(LiveRegMap::iterator i) {
- assert(i != LiveVirtRegs.end() && "Killing unmapped virtual register");
- unsigned VirtReg = i->first;
- const LiveReg &LR = i->second;
- assert(PhysRegState[LR.PhysReg] == VirtReg && "Broken RegState mapping");
- PhysRegState[LR.PhysReg] = regFree;
+/// addKillFlag - Set kill flags on last use of a virtual register.
+void RAFast::addKillFlag(LiveRegMap::iterator lri) {
+ assert(lri != LiveVirtRegs.end() && "Killing unmapped virtual register");
+ const LiveReg &LR = lri->second;
if (LR.LastUse) {
MachineOperand &MO = LR.LastUse->getOperand(LR.LastOpNum);
- if (MO.isUse()) MO.setIsKill();
- else MO.setIsDead();
- DEBUG(dbgs() << " - last seen here: " << *LR.LastUse);
+ if (MO.isDef())
+ MO.setIsDead();
+ else if (!LR.LastUse->isRegTiedToDefOperand(LR.LastOpNum))
+ MO.setIsKill();
+ DEBUG(dbgs() << " %reg" << lri->first << " killed: " << *LR.LastUse);
}
- LiveVirtRegs.erase(i);
+}
+
+/// killVirtReg - Mark virtreg as no longer available.
+void RAFast::killVirtReg(LiveRegMap::iterator lri) {
+ addKillFlag(lri);
+ const LiveReg &LR = lri->second;
+ assert(PhysRegState[LR.PhysReg] == lri->first && "Broken RegState mapping");
+ PhysRegState[LR.PhysReg] = regFree;
+ LiveVirtRegs.erase(lri);
}
/// killVirtReg - Mark virtreg as no longer available.
@@ -445,6 +453,8 @@ unsigned RAFast::defineVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
LiveRegMap::iterator lri = LiveVirtRegs.find(VirtReg);
if (lri == LiveVirtRegs.end())
lri = allocVirtReg(MBB, MI, VirtReg);
+ else
+ addKillFlag(lri); // Kill before redefine.
LiveReg &LR = lri->second;
LR.LastUse = MI;
LR.LastOpNum = OpNum;