diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-26 00:11:33 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-26 00:11:33 +0000 |
commit | 2d17293dd00d32208c7857ecdb20b79b0225c353 (patch) | |
tree | 33b585bb08a37d2446b8bbc2d1525682f9124a73 /lib/CodeGen/Spiller.cpp | |
parent | 7c730e77908123a83abcfffe781d368e9b873ce9 (diff) | |
download | llvm-2d17293dd00d32208c7857ecdb20b79b0225c353.tar.gz llvm-2d17293dd00d32208c7857ecdb20b79b0225c353.tar.bz2 llvm-2d17293dd00d32208c7857ecdb20b79b0225c353.tar.xz |
Make the spiller responsible for updating the LiveStacks analysis.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117337 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/Spiller.cpp')
-rw-r--r-- | lib/CodeGen/Spiller.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/CodeGen/Spiller.cpp b/lib/CodeGen/Spiller.cpp index 661b79c1b3..63112870bb 100644 --- a/lib/CodeGen/Spiller.cpp +++ b/lib/CodeGen/Spiller.cpp @@ -12,6 +12,7 @@ #include "Spiller.h" #include "VirtRegMap.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" +#include "llvm/CodeGen/LiveStackAnalysis.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -195,13 +196,17 @@ namespace { /// Falls back on LiveIntervals::addIntervalsForSpills. class StandardSpiller : public Spiller { protected: + MachineFunction *mf; LiveIntervals *lis; + LiveStacks *lss; MachineLoopInfo *loopInfo; VirtRegMap *vrm; public: StandardSpiller(MachineFunctionPass &pass, MachineFunction &mf, VirtRegMap &vrm) - : lis(&pass.getAnalysis<LiveIntervals>()), + : mf(&mf), + lis(&pass.getAnalysis<LiveIntervals>()), + lss(&pass.getAnalysis<LiveStacks>()), loopInfo(pass.getAnalysisIfAvailable<MachineLoopInfo>()), vrm(&vrm) {} @@ -212,6 +217,16 @@ public: std::vector<LiveInterval*> added = lis->addIntervalsForSpills(*li, spillIs, loopInfo, *vrm); newIntervals.insert(newIntervals.end(), added.begin(), added.end()); + + // Update LiveStacks. + int SS = vrm->getStackSlot(li->reg); + if (SS == VirtRegMap::NO_STACK_SLOT) + return; + const TargetRegisterClass *RC = mf->getRegInfo().getRegClass(li->reg); + LiveInterval &SI = lss->getOrCreateInterval(SS, RC); + if (!SI.hasAtLeastOneValue()) + SI.getNextValue(SlotIndex(), 0, lss->getVNInfoAllocator()); + SI.MergeRangesInAsValue(*li, SI.getValNumInfo(0)); } }; |