aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp5
-rw-r--r--lib/CodeGen/VirtRegMap.cpp3
-rw-r--r--lib/CodeGen/VirtRegMap.h19
3 files changed, 25 insertions, 2 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index b237247f7f..b321b3fdf6 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -1165,6 +1165,7 @@ addIntervalsForSpills(const LiveInterval &li,
// it's also guaranteed to be a single val# / range interval.
if (vrm.getPreSplitReg(li.reg)) {
vrm.setIsSplitFromReg(li.reg, 0);
+ vrm.removeKillPoint(li.reg);
bool DefIsReMat = vrm.isReMaterialized(li.reg);
Slot = vrm.getStackSlot(li.reg);
assert(Slot != VirtRegMap::MAX_STACK_SLOT);
@@ -1398,8 +1399,10 @@ addIntervalsForSpills(const LiveInterval &li,
int UseIdx = LastUse->findRegisterUseOperandIdx(LI->reg);
assert(UseIdx != -1);
if (LastUse->getInstrDescriptor()->
- getOperandConstraint(UseIdx, TOI::TIED_TO) == -1)
+ getOperandConstraint(UseIdx, TOI::TIED_TO) == -1) {
LastUse->getOperand(UseIdx).setIsKill();
+ vrm.addKillPoint(LI->reg, &LastUse->getOperand(UseIdx));
+ }
}
RetNewLIs.push_back(LI);
}
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index b8135bfe99..e39f6a7df8 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -64,7 +64,7 @@ VirtRegMap::VirtRegMap(MachineFunction &mf)
: TII(*mf.getTarget().getInstrInfo()), MF(mf),
Virt2PhysMap(NO_PHYS_REG), Virt2StackSlotMap(NO_STACK_SLOT),
Virt2ReMatIdMap(NO_STACK_SLOT), Virt2SplitMap(0),
- ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
+ Virt2SplitKillMap(NULL), ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
grow();
}
@@ -74,6 +74,7 @@ void VirtRegMap::grow() {
Virt2StackSlotMap.grow(LastVirtReg);
Virt2ReMatIdMap.grow(LastVirtReg);
Virt2SplitMap.grow(LastVirtReg);
+ Virt2SplitKillMap.grow(LastVirtReg);
ReMatMap.grow(LastVirtReg);
}
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h
index df32a6566a..7740740548 100644
--- a/lib/CodeGen/VirtRegMap.h
+++ b/lib/CodeGen/VirtRegMap.h
@@ -66,6 +66,10 @@ namespace llvm {
/// mapping.
IndexedMap<unsigned, VirtReg2IndexFunctor> Virt2SplitMap;
+ /// Virt2SplitKillMap - This is splitted virtual register to its last use
+ /// (kill) mapping.
+ IndexedMap<MachineOperand*> Virt2SplitKillMap;
+
/// ReMatMap - This is virtual register to re-materialized instruction
/// mapping. Each virtual register whose definition is going to be
/// re-materialized has an entry in it.
@@ -210,6 +214,21 @@ namespace llvm {
ReMatMap[virtReg] = def;
}
+ /// @brief record the last use (kill) of a split virtual register.
+ void addKillPoint(unsigned virtReg, MachineOperand *Op) {
+ Virt2SplitKillMap[virtReg] = Op;
+ }
+
+ /// @brief reset and remove the last use (kill) of a split virtual register.
+ void removeKillPoint(unsigned virtReg) {
+ MachineOperand *MO = Virt2SplitKillMap[virtReg];
+ if (MO) {
+ assert(MO->isKill() && "Split last use is not marked kill?");
+ MO->unsetIsKill();
+ Virt2SplitKillMap[virtReg] = NULL;
+ }
+ }
+
/// @brief returns true if the specified MachineInstr is a spill point.
bool isSpillPt(MachineInstr *Pt) const {
return SpillPt2VirtMap.find(Pt) != SpillPt2VirtMap.end();