aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-12-05 10:24:35 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-12-05 10:24:35 +0000
commitd120ffd26f2715c600b028d4eac9a3c41a9f4653 (patch)
tree4f7b2a64495bbf17efd489ab883626e989d8282e /lib
parentadf85906906ebf85c57c333e8209f37ef11a6c99 (diff)
downloadexternal_llvm-d120ffd26f2715c600b028d4eac9a3c41a9f4653.zip
external_llvm-d120ffd26f2715c600b028d4eac9a3c41a9f4653.tar.gz
external_llvm-d120ffd26f2715c600b028d4eac9a3c41a9f4653.tar.bz2
MachineInstr can change. Store indexes instead.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44612 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp14
-rw-r--r--lib/CodeGen/VirtRegMap.cpp2
-rw-r--r--lib/CodeGen/VirtRegMap.h21
3 files changed, 23 insertions, 14 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index b321b3f..a9e6948 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -1165,6 +1165,15 @@ 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);
+ // Unset the split kill marker on the last use.
+ unsigned KillIdx = vrm.getKillPoint(li.reg);
+ if (KillIdx) {
+ MachineInstr *KillMI = getInstructionFromIndex(KillIdx);
+ assert(KillMI && "Last use disappeared?");
+ int KillOp = KillMI->findRegisterUseOperandIdx(li.reg, true);
+ assert(KillOp != -1 && "Last use disappeared?");
+ KillMI->getOperand(KillOp).unsetIsKill();
+ }
vrm.removeKillPoint(li.reg);
bool DefIsReMat = vrm.isReMaterialized(li.reg);
Slot = vrm.getStackSlot(li.reg);
@@ -1395,13 +1404,14 @@ addIntervalsForSpills(const LiveInterval &li,
LI->weight /= LI->getSize();
if (!AddedKill.count(LI)) {
LiveRange *LR = &LI->ranges[LI->ranges.size()-1];
- MachineInstr *LastUse = getInstructionFromIndex(getBaseIndex(LR->end));
+ unsigned LastUseIdx = getBaseIndex(LR->end);
+ MachineInstr *LastUse = getInstructionFromIndex(LastUseIdx);
int UseIdx = LastUse->findRegisterUseOperandIdx(LI->reg);
assert(UseIdx != -1);
if (LastUse->getInstrDescriptor()->
getOperandConstraint(UseIdx, TOI::TIED_TO) == -1) {
LastUse->getOperand(UseIdx).setIsKill();
- vrm.addKillPoint(LI->reg, &LastUse->getOperand(UseIdx));
+ vrm.addKillPoint(LI->reg, LastUseIdx);
}
}
RetNewLIs.push_back(LI);
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index e39f6a7..d0fd62a 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),
- Virt2SplitKillMap(NULL), ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
+ Virt2SplitKillMap(0), ReMatMap(NULL), ReMatId(MAX_STACK_SLOT+1) {
grow();
}
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h
index 7740740..192d64a 100644
--- a/lib/CodeGen/VirtRegMap.h
+++ b/lib/CodeGen/VirtRegMap.h
@@ -67,8 +67,8 @@ namespace llvm {
IndexedMap<unsigned, VirtReg2IndexFunctor> Virt2SplitMap;
/// Virt2SplitKillMap - This is splitted virtual register to its last use
- /// (kill) mapping.
- IndexedMap<MachineOperand*> Virt2SplitKillMap;
+ /// (kill) index mapping.
+ IndexedMap<unsigned> Virt2SplitKillMap;
/// ReMatMap - This is virtual register to re-materialized instruction
/// mapping. Each virtual register whose definition is going to be
@@ -215,18 +215,17 @@ namespace llvm {
}
/// @brief record the last use (kill) of a split virtual register.
- void addKillPoint(unsigned virtReg, MachineOperand *Op) {
- Virt2SplitKillMap[virtReg] = Op;
+ void addKillPoint(unsigned virtReg, unsigned index) {
+ Virt2SplitKillMap[virtReg] = index;
}
- /// @brief reset and remove the last use (kill) of a split virtual register.
+ unsigned getKillPoint(unsigned virtReg) const {
+ return Virt2SplitKillMap[virtReg];
+ }
+
+ /// @brief 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;
- }
+ Virt2SplitKillMap[virtReg] = 0;
}
/// @brief returns true if the specified MachineInstr is a spill point.