summaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveRangeEdit.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-15 00:16:55 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-15 00:16:55 +0000
commit2a0180fbff4870995482d96986ad780ab9de8af4 (patch)
treebdc45da8da7bd2b28082cb5d0f1e6b564e417bcd /lib/CodeGen/LiveRangeEdit.cpp
parenta17768f5822ab62bc18608e5ba473187bf726b84 (diff)
downloadllvm-2a0180fbff4870995482d96986ad780ab9de8af4.tar.gz
llvm-2a0180fbff4870995482d96986ad780ab9de8af4.tar.bz2
llvm-2a0180fbff4870995482d96986ad780ab9de8af4.tar.xz
Move stack slot assignments into LiveRangeEdit.
All registers created during splitting or spilling are assigned to the same stack slot as the parent register. When splitting or rematting, we may not spill at all. In that case the stack slot is still assigned, but it will be dead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116546 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveRangeEdit.cpp')
-rw-r--r--lib/CodeGen/LiveRangeEdit.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/CodeGen/LiveRangeEdit.cpp b/lib/CodeGen/LiveRangeEdit.cpp
index 8a123fbe70..463ebcb4ae 100644
--- a/lib/CodeGen/LiveRangeEdit.cpp
+++ b/lib/CodeGen/LiveRangeEdit.cpp
@@ -18,12 +18,21 @@
using namespace llvm;
+int LiveRangeEdit::assignStackSlot(VirtRegMap &vrm) {
+ int ss = vrm.getStackSlot(getReg());
+ if (ss != VirtRegMap::NO_STACK_SLOT)
+ return ss;
+ return vrm.assignVirt2StackSlot(getReg());
+}
+
LiveInterval &LiveRangeEdit::create(MachineRegisterInfo &mri,
LiveIntervals &lis,
VirtRegMap &vrm) {
const TargetRegisterClass *RC = mri.getRegClass(parent_.reg);
unsigned VReg = mri.createVirtualRegister(RC);
vrm.grow();
+ // Immediately assign to the same stack slot as parent.
+ vrm.assignVirt2StackSlot(VReg, assignStackSlot(vrm));
LiveInterval &li = lis.getOrCreateInterval(VReg);
newRegs_.push_back(&li);
return li;