blob: 73980f38b99566efd84a3c02140ee1e3ad161d3e [file] [log] [blame]
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +00001//===-------- InlineSpiller.cpp - Insert spills and restores inline -------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// The inline spiller modifies the machine function directly instead of
11// inserting spills and restores in VirtRegMap.
12//
13//===----------------------------------------------------------------------===//
14
15#define DEBUG_TYPE "spiller"
16#include "Spiller.h"
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000017#include "LiveRangeEdit.h"
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +000018#include "SplitKit.h"
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000019#include "VirtRegMap.h"
20#include "llvm/CodeGen/LiveIntervalAnalysis.h"
Jakob Stoklund Olesen0a12b802010-10-26 00:11:35 +000021#include "llvm/CodeGen/LiveStackAnalysis.h"
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000022#include "llvm/CodeGen/MachineFrameInfo.h"
23#include "llvm/CodeGen/MachineFunction.h"
Jakob Stoklund Olesen9529a1c2010-07-19 18:41:20 +000024#include "llvm/CodeGen/MachineLoopInfo.h"
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000025#include "llvm/CodeGen/MachineRegisterInfo.h"
26#include "llvm/Target/TargetMachine.h"
27#include "llvm/Target/TargetInstrInfo.h"
Jakob Stoklund Olesen26b92be2010-10-28 20:34:47 +000028#include "llvm/Support/CommandLine.h"
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000029#include "llvm/Support/Debug.h"
30#include "llvm/Support/raw_ostream.h"
31
32using namespace llvm;
33
Jakob Stoklund Olesen26b92be2010-10-28 20:34:47 +000034static cl::opt<bool>
35VerifySpills("verify-spills", cl::desc("Verify after each spill/split"));
36
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000037namespace {
38class InlineSpiller : public Spiller {
Jakob Stoklund Olesen6d108e22010-08-06 18:47:06 +000039 MachineFunctionPass &pass_;
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000040 MachineFunction &mf_;
41 LiveIntervals &lis_;
Jakob Stoklund Olesen0a12b802010-10-26 00:11:35 +000042 LiveStacks &lss_;
Jakob Stoklund Olesen9529a1c2010-07-19 18:41:20 +000043 MachineLoopInfo &loops_;
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000044 VirtRegMap &vrm_;
45 MachineFrameInfo &mfi_;
46 MachineRegisterInfo &mri_;
47 const TargetInstrInfo &tii_;
48 const TargetRegisterInfo &tri_;
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +000049 const BitVector reserved_;
50
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +000051 SplitAnalysis splitAnalysis_;
52
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +000053 // Variables that are valid during spill(), but used by multiple methods.
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000054 LiveRangeEdit *edit_;
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +000055 const TargetRegisterClass *rc_;
56 int stackSlot_;
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000057
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +000058 // Values that failed to remat at some point.
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +000059 SmallPtrSet<VNInfo*, 8> usedValues_;
60
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000061 ~InlineSpiller() {}
62
63public:
Jakob Stoklund Olesenf2c6e362010-07-20 23:50:15 +000064 InlineSpiller(MachineFunctionPass &pass,
65 MachineFunction &mf,
66 VirtRegMap &vrm)
Jakob Stoklund Olesen6d108e22010-08-06 18:47:06 +000067 : pass_(pass),
68 mf_(mf),
Jakob Stoklund Olesenf2c6e362010-07-20 23:50:15 +000069 lis_(pass.getAnalysis<LiveIntervals>()),
Jakob Stoklund Olesen0a12b802010-10-26 00:11:35 +000070 lss_(pass.getAnalysis<LiveStacks>()),
Jakob Stoklund Olesenf2c6e362010-07-20 23:50:15 +000071 loops_(pass.getAnalysis<MachineLoopInfo>()),
72 vrm_(vrm),
73 mfi_(*mf.getFrameInfo()),
74 mri_(mf.getRegInfo()),
75 tii_(*mf.getTarget().getInstrInfo()),
76 tri_(*mf.getTarget().getRegisterInfo()),
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +000077 reserved_(tri_.getReservedRegs(mf_)),
Jakob Stoklund Olesenf2c6e362010-07-20 23:50:15 +000078 splitAnalysis_(mf, lis_, loops_) {}
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000079
80 void spill(LiveInterval *li,
Jakob Stoklund Olesen0a2b2a12010-08-13 22:56:53 +000081 SmallVectorImpl<LiveInterval*> &newIntervals,
82 SmallVectorImpl<LiveInterval*> &spillIs);
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +000083
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000084 void spill(LiveRangeEdit &);
85
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +000086private:
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +000087 bool split();
88
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +000089 bool reMaterializeFor(MachineBasicBlock::iterator MI);
90 void reMaterializeAll();
91
Jakob Stoklund Olesen1a0f91b2010-08-04 22:35:11 +000092 bool coalesceStackAccess(MachineInstr *MI);
Jakob Stoklund Olesene72a5c52010-07-01 00:13:04 +000093 bool foldMemoryOperand(MachineBasicBlock::iterator MI,
94 const SmallVectorImpl<unsigned> &Ops);
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +000095 void insertReload(LiveInterval &NewLI, MachineBasicBlock::iterator MI);
96 void insertSpill(LiveInterval &NewLI, MachineBasicBlock::iterator MI);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +000097};
98}
99
100namespace llvm {
Jakob Stoklund Olesenf2c6e362010-07-20 23:50:15 +0000101Spiller *createInlineSpiller(MachineFunctionPass &pass,
102 MachineFunction &mf,
103 VirtRegMap &vrm) {
104 return new InlineSpiller(pass, mf, vrm);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000105}
106}
107
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000108/// split - try splitting the current interval into pieces that may allocate
109/// separately. Return true if successful.
110bool InlineSpiller::split() {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000111 splitAnalysis_.analyze(&edit_->getParent());
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000112
Jakob Stoklund Olesen57d0f2d2010-10-05 22:19:33 +0000113 // Try splitting around loops.
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000114 if (const MachineLoop *loop = splitAnalysis_.getBestSplitLoop()) {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000115 SplitEditor(splitAnalysis_, lis_, vrm_, *edit_)
Jakob Stoklund Olesen57d0f2d2010-10-05 22:19:33 +0000116 .splitAroundLoop(loop);
117 return true;
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000118 }
Jakob Stoklund Olesenf1b05f22010-08-12 17:07:14 +0000119
120 // Try splitting into single block intervals.
121 SplitAnalysis::BlockPtrSet blocks;
122 if (splitAnalysis_.getMultiUseBlocks(blocks)) {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000123 SplitEditor(splitAnalysis_, lis_, vrm_, *edit_)
Jakob Stoklund Olesen57d0f2d2010-10-05 22:19:33 +0000124 .splitSingleBlocks(blocks);
125 return true;
Jakob Stoklund Olesenf1b05f22010-08-12 17:07:14 +0000126 }
127
Jakob Stoklund Olesenfc412d82010-08-13 21:18:48 +0000128 // Try splitting inside a basic block.
129 if (const MachineBasicBlock *MBB = splitAnalysis_.getBlockForInsideSplit()) {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000130 SplitEditor(splitAnalysis_, lis_, vrm_, *edit_)
Jakob Stoklund Olesen57d0f2d2010-10-05 22:19:33 +0000131 .splitInsideBlock(MBB);
132 return true;
Jakob Stoklund Olesenfc412d82010-08-13 21:18:48 +0000133 }
134
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000135 return false;
136}
137
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000138/// reMaterializeFor - Attempt to rematerialize edit_->getReg() before MI instead of
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000139/// reloading it.
140bool InlineSpiller::reMaterializeFor(MachineBasicBlock::iterator MI) {
141 SlotIndex UseIdx = lis_.getInstructionIndex(MI).getUseIndex();
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000142 VNInfo *OrigVNI = edit_->getParent().getVNInfoAt(UseIdx);
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000143
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000144 if (!OrigVNI) {
145 DEBUG(dbgs() << "\tadding <undef> flags: ");
146 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
147 MachineOperand &MO = MI->getOperand(i);
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000148 if (MO.isReg() && MO.isUse() && MO.getReg() == edit_->getReg())
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000149 MO.setIsUndef();
150 }
151 DEBUG(dbgs() << UseIdx << '\t' << *MI);
152 return true;
153 }
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000154
155 LiveRangeEdit::Remat RM = edit_->canRematerializeAt(OrigVNI, UseIdx, false,
156 lis_);
157 if (!RM) {
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000158 usedValues_.insert(OrigVNI);
159 DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << *MI);
160 return false;
161 }
162
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000163 // If the instruction also writes edit_->getReg(), it had better not require
164 // the same register for uses and defs.
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000165 bool Reads, Writes;
166 SmallVector<unsigned, 8> Ops;
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000167 tie(Reads, Writes) = MI->readsWritesVirtualRegister(edit_->getReg(), &Ops);
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000168 if (Writes) {
169 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
170 MachineOperand &MO = MI->getOperand(Ops[i]);
171 if (MO.isUse() ? MI->isRegTiedToDefOperand(Ops[i]) : MO.getSubReg()) {
172 usedValues_.insert(OrigVNI);
173 DEBUG(dbgs() << "\tcannot remat tied reg: " << UseIdx << '\t' << *MI);
174 return false;
175 }
176 }
177 }
178
179 // Alocate a new register for the remat.
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000180 LiveInterval &NewLI = edit_->create(mri_, lis_, vrm_);
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000181 NewLI.markNotSpillable();
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000182
183 // Finally we can rematerialize OrigMI before MI.
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000184 SlotIndex DefIdx = edit_->rematerializeAt(*MI->getParent(), MI, NewLI.reg, RM,
185 lis_, tii_, tri_);
186 DEBUG(dbgs() << "\tremat: " << DefIdx << '\n');
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000187
188 // Replace operands
189 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
190 MachineOperand &MO = MI->getOperand(Ops[i]);
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000191 if (MO.isReg() && MO.isUse() && MO.getReg() == edit_->getReg()) {
192 MO.setReg(NewLI.reg);
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000193 MO.setIsKill();
194 }
195 }
196 DEBUG(dbgs() << "\t " << UseIdx << '\t' << *MI);
197
Lang Hames6e2968c2010-09-25 12:04:16 +0000198 VNInfo *DefVNI = NewLI.getNextValue(DefIdx, 0, lis_.getVNInfoAllocator());
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000199 NewLI.addRange(LiveRange(DefIdx, UseIdx.getDefIndex(), DefVNI));
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000200 DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000201 return true;
202}
203
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000204/// reMaterializeAll - Try to rematerialize as many uses as possible,
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000205/// and trim the live ranges after.
206void InlineSpiller::reMaterializeAll() {
207 // Do a quick scan of the interval values to find if any are remattable.
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000208 if (!edit_->anyRematerializable(lis_, tii_, 0))
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000209 return;
210
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000211 usedValues_.clear();
212
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000213 // Try to remat before all uses of edit_->getReg().
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000214 bool anyRemat = false;
215 for (MachineRegisterInfo::use_nodbg_iterator
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000216 RI = mri_.use_nodbg_begin(edit_->getReg());
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000217 MachineInstr *MI = RI.skipInstruction();)
218 anyRemat |= reMaterializeFor(MI);
219
220 if (!anyRemat)
221 return;
222
223 // Remove any values that were completely rematted.
224 bool anyRemoved = false;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000225 for (LiveInterval::vni_iterator I = edit_->getParent().vni_begin(),
226 E = edit_->getParent().vni_end(); I != E; ++I) {
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000227 VNInfo *VNI = *I;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000228 if (VNI->hasPHIKill() || !edit_->didRematerialize(VNI) ||
229 usedValues_.count(VNI))
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000230 continue;
231 MachineInstr *DefMI = lis_.getInstructionFromIndex(VNI->def);
232 DEBUG(dbgs() << "\tremoving dead def: " << VNI->def << '\t' << *DefMI);
233 lis_.RemoveMachineInstrFromMaps(DefMI);
234 vrm_.RemoveMachineInstrFromMaps(DefMI);
235 DefMI->eraseFromParent();
Lang Hamescec29452010-09-26 03:37:09 +0000236 VNI->def = SlotIndex();
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000237 anyRemoved = true;
238 }
239
240 if (!anyRemoved)
241 return;
242
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000243 // Removing values may cause debug uses where parent is not live.
244 for (MachineRegisterInfo::use_iterator RI = mri_.use_begin(edit_->getReg());
Jakob Stoklund Olesen3b9c7eb2010-07-02 19:54:40 +0000245 MachineInstr *MI = RI.skipInstruction();) {
246 if (!MI->isDebugValue())
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000247 continue;
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000248 // Try to preserve the debug value if parent is live immediately after it.
Jakob Stoklund Olesen3b9c7eb2010-07-02 19:54:40 +0000249 MachineBasicBlock::iterator NextMI = MI;
250 ++NextMI;
251 if (NextMI != MI->getParent()->end() && !lis_.isNotInMIMap(NextMI)) {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000252 SlotIndex Idx = lis_.getInstructionIndex(NextMI);
253 VNInfo *VNI = edit_->getParent().getVNInfoAt(Idx);
Jakob Stoklund Olesenb67b12e2010-08-10 20:45:07 +0000254 if (VNI && (VNI->hasPHIKill() || usedValues_.count(VNI)))
Jakob Stoklund Olesen3b9c7eb2010-07-02 19:54:40 +0000255 continue;
256 }
257 DEBUG(dbgs() << "Removing debug info due to remat:" << "\t" << *MI);
Jakob Stoklund Olesen3b9c7eb2010-07-02 19:54:40 +0000258 MI->eraseFromParent();
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000259 }
260}
261
Jakob Stoklund Olesen1a0f91b2010-08-04 22:35:11 +0000262/// If MI is a load or store of stackSlot_, it can be removed.
263bool InlineSpiller::coalesceStackAccess(MachineInstr *MI) {
264 int FI = 0;
265 unsigned reg;
266 if (!(reg = tii_.isLoadFromStackSlot(MI, FI)) &&
267 !(reg = tii_.isStoreToStackSlot(MI, FI)))
268 return false;
269
270 // We have a stack access. Is it the right register and slot?
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000271 if (reg != edit_->getReg() || FI != stackSlot_)
Jakob Stoklund Olesen1a0f91b2010-08-04 22:35:11 +0000272 return false;
273
274 DEBUG(dbgs() << "Coalescing stack access: " << *MI);
275 lis_.RemoveMachineInstrFromMaps(MI);
276 MI->eraseFromParent();
277 return true;
278}
279
Jakob Stoklund Olesene72a5c52010-07-01 00:13:04 +0000280/// foldMemoryOperand - Try folding stack slot references in Ops into MI.
281/// Return true on success, and MI will be erased.
282bool InlineSpiller::foldMemoryOperand(MachineBasicBlock::iterator MI,
283 const SmallVectorImpl<unsigned> &Ops) {
284 // TargetInstrInfo::foldMemoryOperand only expects explicit, non-tied
285 // operands.
286 SmallVector<unsigned, 8> FoldOps;
287 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
288 unsigned Idx = Ops[i];
289 MachineOperand &MO = MI->getOperand(Idx);
290 if (MO.isImplicit())
291 continue;
292 // FIXME: Teach targets to deal with subregs.
293 if (MO.getSubReg())
294 return false;
295 // Tied use operands should not be passed to foldMemoryOperand.
296 if (!MI->isRegTiedToDefOperand(Idx))
297 FoldOps.push_back(Idx);
298 }
299
Jakob Stoklund Olesene05442d2010-07-09 17:29:08 +0000300 MachineInstr *FoldMI = tii_.foldMemoryOperand(MI, FoldOps, stackSlot_);
Jakob Stoklund Olesene72a5c52010-07-01 00:13:04 +0000301 if (!FoldMI)
302 return false;
Jakob Stoklund Olesene72a5c52010-07-01 00:13:04 +0000303 lis_.ReplaceMachineInstrInMaps(MI, FoldMI);
304 vrm_.addSpillSlotUse(stackSlot_, FoldMI);
Jakob Stoklund Olesene05442d2010-07-09 17:29:08 +0000305 MI->eraseFromParent();
Jakob Stoklund Olesene72a5c52010-07-01 00:13:04 +0000306 DEBUG(dbgs() << "\tfolded: " << *FoldMI);
307 return true;
308}
309
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000310/// insertReload - Insert a reload of NewLI.reg before MI.
311void InlineSpiller::insertReload(LiveInterval &NewLI,
312 MachineBasicBlock::iterator MI) {
313 MachineBasicBlock &MBB = *MI->getParent();
314 SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex();
315 tii_.loadRegFromStackSlot(MBB, MI, NewLI.reg, stackSlot_, rc_, &tri_);
316 --MI; // Point to load instruction.
317 SlotIndex LoadIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex();
318 vrm_.addSpillSlotUse(stackSlot_, MI);
319 DEBUG(dbgs() << "\treload: " << LoadIdx << '\t' << *MI);
Lang Hames6e2968c2010-09-25 12:04:16 +0000320 VNInfo *LoadVNI = NewLI.getNextValue(LoadIdx, 0,
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000321 lis_.getVNInfoAllocator());
322 NewLI.addRange(LiveRange(LoadIdx, Idx, LoadVNI));
323}
324
325/// insertSpill - Insert a spill of NewLI.reg after MI.
326void InlineSpiller::insertSpill(LiveInterval &NewLI,
327 MachineBasicBlock::iterator MI) {
328 MachineBasicBlock &MBB = *MI->getParent();
329 SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex();
330 tii_.storeRegToStackSlot(MBB, ++MI, NewLI.reg, true, stackSlot_, rc_, &tri_);
331 --MI; // Point to store instruction.
332 SlotIndex StoreIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex();
333 vrm_.addSpillSlotUse(stackSlot_, MI);
334 DEBUG(dbgs() << "\tspilled: " << StoreIdx << '\t' << *MI);
Lang Hames6e2968c2010-09-25 12:04:16 +0000335 VNInfo *StoreVNI = NewLI.getNextValue(Idx, 0, lis_.getVNInfoAllocator());
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000336 NewLI.addRange(LiveRange(Idx, StoreIdx, StoreVNI));
337}
338
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000339void InlineSpiller::spill(LiveInterval *li,
Jakob Stoklund Olesen0a2b2a12010-08-13 22:56:53 +0000340 SmallVectorImpl<LiveInterval*> &newIntervals,
341 SmallVectorImpl<LiveInterval*> &spillIs) {
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000342 LiveRangeEdit edit(*li, newIntervals, spillIs);
343 spill(edit);
Jakob Stoklund Olesen26b92be2010-10-28 20:34:47 +0000344 if (VerifySpills)
345 mf_.verify(&pass_);
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000346}
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000347
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000348void InlineSpiller::spill(LiveRangeEdit &edit) {
349 edit_ = &edit;
350 DEBUG(dbgs() << "Inline spilling " << edit.getParent() << "\n");
351 assert(edit.getParent().isSpillable() &&
352 "Attempting to spill already spilled value.");
353 assert(!edit.getParent().isStackSlot() && "Trying to spill a stack slot.");
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000354
Jakob Stoklund Olesen8ae02632010-07-20 15:41:07 +0000355 if (split())
356 return;
357
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000358 reMaterializeAll();
359
360 // Remat may handle everything.
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000361 if (edit_->getParent().empty())
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000362 return;
363
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000364 rc_ = mri_.getRegClass(edit.getReg());
Jakob Stoklund Olesen2a0180f2010-10-15 00:16:55 +0000365 stackSlot_ = edit.assignStackSlot(vrm_);
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000366
Jakob Stoklund Olesen0a12b802010-10-26 00:11:35 +0000367 // Update LiveStacks now that we are committed to spilling.
368 LiveInterval &stacklvr = lss_.getOrCreateInterval(stackSlot_, rc_);
369 if (!stacklvr.hasAtLeastOneValue())
370 stacklvr.getNextValue(SlotIndex(), 0, lss_.getVNInfoAllocator());
371 stacklvr.MergeRangesInAsValue(edit_->getParent(), stacklvr.getValNumInfo(0));
372
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000373 // Iterate over instructions using register.
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000374 for (MachineRegisterInfo::reg_iterator RI = mri_.reg_begin(edit.getReg());
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000375 MachineInstr *MI = RI.skipInstruction();) {
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000376
Jakob Stoklund Olesen3b9c7eb2010-07-02 19:54:40 +0000377 // Debug values are not allowed to affect codegen.
378 if (MI->isDebugValue()) {
379 // Modify DBG_VALUE now that the value is in a spill slot.
380 uint64_t Offset = MI->getOperand(1).getImm();
381 const MDNode *MDPtr = MI->getOperand(2).getMetadata();
382 DebugLoc DL = MI->getDebugLoc();
383 if (MachineInstr *NewDV = tii_.emitFrameIndexDebugValue(mf_, stackSlot_,
384 Offset, MDPtr, DL)) {
385 DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI);
386 MachineBasicBlock *MBB = MI->getParent();
387 MBB->insert(MBB->erase(MI), NewDV);
388 } else {
389 DEBUG(dbgs() << "Removing debug info due to spill:" << "\t" << *MI);
390 MI->eraseFromParent();
391 }
392 continue;
393 }
394
Jakob Stoklund Olesen1a0f91b2010-08-04 22:35:11 +0000395 // Stack slot accesses may coalesce away.
396 if (coalesceStackAccess(MI))
397 continue;
398
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000399 // Analyze instruction.
400 bool Reads, Writes;
401 SmallVector<unsigned, 8> Ops;
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000402 tie(Reads, Writes) = MI->readsWritesVirtualRegister(edit.getReg(), &Ops);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000403
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000404 // Attempt to fold memory ops.
405 if (foldMemoryOperand(MI, Ops))
406 continue;
407
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000408 // Allocate interval around instruction.
409 // FIXME: Infer regclass from instruction alone.
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000410 LiveInterval &NewLI = edit.create(mri_, lis_, vrm_);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000411 NewLI.markNotSpillable();
412
Jakob Stoklund Olesen8de3b1e2010-07-02 17:44:57 +0000413 if (Reads)
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000414 insertReload(NewLI, MI);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000415
416 // Rewrite instruction operands.
417 bool hasLiveDef = false;
418 for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
419 MachineOperand &MO = MI->getOperand(Ops[i]);
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +0000420 MO.setReg(NewLI.reg);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000421 if (MO.isUse()) {
422 if (!MI->isRegTiedToDefOperand(Ops[i]))
423 MO.setIsKill();
424 } else {
425 if (!MO.isDead())
426 hasLiveDef = true;
427 }
428 }
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000429
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000430 // FIXME: Use a second vreg if instruction has no tied ops.
Jakob Stoklund Olesen9e55afb2010-06-30 23:03:52 +0000431 if (Writes && hasLiveDef)
432 insertSpill(NewLI, MI);
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000433
434 DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
Jakob Stoklund Olesen914f2ff2010-06-29 23:58:39 +0000435 }
436}