Coalesce stack slot accesses that arise when spilling both sides of a COPY.
[oota-llvm.git] / lib / CodeGen / InlineSpiller.cpp
1 //===-------- 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"
17 #include "SplitKit.h"
18 #include "VirtRegMap.h"
19 #include "llvm/CodeGen/LiveIntervalAnalysis.h"
20 #include "llvm/CodeGen/MachineFrameInfo.h"
21 #include "llvm/CodeGen/MachineFunction.h"
22 #include "llvm/CodeGen/MachineLoopInfo.h"
23 #include "llvm/CodeGen/MachineRegisterInfo.h"
24 #include "llvm/Target/TargetMachine.h"
25 #include "llvm/Target/TargetInstrInfo.h"
26 #include "llvm/Support/Debug.h"
27 #include "llvm/Support/raw_ostream.h"
28
29 using namespace llvm;
30
31 namespace {
32 class InlineSpiller : public Spiller {
33   MachineFunction &mf_;
34   LiveIntervals &lis_;
35   MachineLoopInfo &loops_;
36   VirtRegMap &vrm_;
37   MachineFrameInfo &mfi_;
38   MachineRegisterInfo &mri_;
39   const TargetInstrInfo &tii_;
40   const TargetRegisterInfo &tri_;
41   const BitVector reserved_;
42
43   SplitAnalysis splitAnalysis_;
44
45   // Variables that are valid during spill(), but used by multiple methods.
46   LiveInterval *li_;
47   std::vector<LiveInterval*> *newIntervals_;
48   const TargetRegisterClass *rc_;
49   int stackSlot_;
50   const SmallVectorImpl<LiveInterval*> *spillIs_;
51
52   // Values of the current interval that can potentially remat.
53   SmallPtrSet<VNInfo*, 8> reMattable_;
54
55   // Values in reMattable_ that failed to remat at some point.
56   SmallPtrSet<VNInfo*, 8> usedValues_;
57
58   ~InlineSpiller() {}
59
60 public:
61   InlineSpiller(MachineFunctionPass &pass,
62                 MachineFunction &mf,
63                 VirtRegMap &vrm)
64     : mf_(mf),
65       lis_(pass.getAnalysis<LiveIntervals>()),
66       loops_(pass.getAnalysis<MachineLoopInfo>()),
67       vrm_(vrm),
68       mfi_(*mf.getFrameInfo()),
69       mri_(mf.getRegInfo()),
70       tii_(*mf.getTarget().getInstrInfo()),
71       tri_(*mf.getTarget().getRegisterInfo()),
72       reserved_(tri_.getReservedRegs(mf_)),
73       splitAnalysis_(mf, lis_, loops_) {}
74
75   void spill(LiveInterval *li,
76              std::vector<LiveInterval*> &newIntervals,
77              SmallVectorImpl<LiveInterval*> &spillIs,
78              SlotIndex *earliestIndex);
79
80 private:
81   bool split();
82
83   bool allUsesAvailableAt(const MachineInstr *OrigMI, SlotIndex OrigIdx,
84                           SlotIndex UseIdx);
85   bool reMaterializeFor(MachineBasicBlock::iterator MI);
86   void reMaterializeAll();
87
88   bool coalesceStackAccess(MachineInstr *MI);
89   bool foldMemoryOperand(MachineBasicBlock::iterator MI,
90                          const SmallVectorImpl<unsigned> &Ops);
91   void insertReload(LiveInterval &NewLI, MachineBasicBlock::iterator MI);
92   void insertSpill(LiveInterval &NewLI, MachineBasicBlock::iterator MI);
93 };
94 }
95
96 namespace llvm {
97 Spiller *createInlineSpiller(MachineFunctionPass &pass,
98                              MachineFunction &mf,
99                              VirtRegMap &vrm) {
100   return new InlineSpiller(pass, mf, vrm);
101 }
102 }
103
104 /// split - try splitting the current interval into pieces that may allocate
105 /// separately. Return true if successful.
106 bool InlineSpiller::split() {
107   // FIXME: Add intra-MBB splitting.
108   if (lis_.intervalIsInOneMBB(*li_))
109     return false;
110
111   splitAnalysis_.analyze(li_);
112
113   if (const MachineLoop *loop = splitAnalysis_.getBestSplitLoop()) {
114     SplitEditor(splitAnalysis_, lis_, vrm_, *newIntervals_)
115       .splitAroundLoop(loop);
116     return true;
117   }
118   return false;
119 }
120
121 /// allUsesAvailableAt - Return true if all registers used by OrigMI at
122 /// OrigIdx are also available with the same value at UseIdx.
123 bool InlineSpiller::allUsesAvailableAt(const MachineInstr *OrigMI,
124                                        SlotIndex OrigIdx,
125                                        SlotIndex UseIdx) {
126   OrigIdx = OrigIdx.getUseIndex();
127   UseIdx = UseIdx.getUseIndex();
128   for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
129     const MachineOperand &MO = OrigMI->getOperand(i);
130     if (!MO.isReg() || !MO.getReg() || MO.getReg() == li_->reg)
131       continue;
132     // Reserved registers are OK.
133     if (MO.isUndef() || !lis_.hasInterval(MO.getReg()))
134       continue;
135     // We don't want to move any defs.
136     if (MO.isDef())
137       return false;
138     // We cannot depend on virtual registers in spillIs_. They will be spilled.
139     for (unsigned si = 0, se = spillIs_->size(); si != se; ++si)
140       if ((*spillIs_)[si]->reg == MO.getReg())
141         return false;
142
143     LiveInterval &LI = lis_.getInterval(MO.getReg());
144     const VNInfo *OVNI = LI.getVNInfoAt(OrigIdx);
145     if (!OVNI)
146       continue;
147     if (OVNI != LI.getVNInfoAt(UseIdx))
148       return false;
149   }
150   return true;
151 }
152
153 /// reMaterializeFor - Attempt to rematerialize li_->reg before MI instead of
154 /// reloading it.
155 bool InlineSpiller::reMaterializeFor(MachineBasicBlock::iterator MI) {
156   SlotIndex UseIdx = lis_.getInstructionIndex(MI).getUseIndex();
157   VNInfo *OrigVNI = li_->getVNInfoAt(UseIdx);
158   if (!OrigVNI) {
159     DEBUG(dbgs() << "\tadding <undef> flags: ");
160     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
161       MachineOperand &MO = MI->getOperand(i);
162       if (MO.isReg() && MO.isUse() && MO.getReg() == li_->reg)
163         MO.setIsUndef();
164     }
165     DEBUG(dbgs() << UseIdx << '\t' << *MI);
166     return true;
167   }
168   if (!reMattable_.count(OrigVNI)) {
169     DEBUG(dbgs() << "\tusing non-remat valno " << OrigVNI->id << ": "
170                  << UseIdx << '\t' << *MI);
171     return false;
172   }
173   MachineInstr *OrigMI = lis_.getInstructionFromIndex(OrigVNI->def);
174   if (!allUsesAvailableAt(OrigMI, OrigVNI->def, UseIdx)) {
175     usedValues_.insert(OrigVNI);
176     DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << *MI);
177     return false;
178   }
179
180   // If the instruction also writes li_->reg, it had better not require the same
181   // register for uses and defs.
182   bool Reads, Writes;
183   SmallVector<unsigned, 8> Ops;
184   tie(Reads, Writes) = MI->readsWritesVirtualRegister(li_->reg, &Ops);
185   if (Writes) {
186     for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
187       MachineOperand &MO = MI->getOperand(Ops[i]);
188       if (MO.isUse() ? MI->isRegTiedToDefOperand(Ops[i]) : MO.getSubReg()) {
189         usedValues_.insert(OrigVNI);
190         DEBUG(dbgs() << "\tcannot remat tied reg: " << UseIdx << '\t' << *MI);
191         return false;
192       }
193     }
194   }
195
196   // Alocate a new register for the remat.
197   unsigned NewVReg = mri_.createVirtualRegister(rc_);
198   vrm_.grow();
199   LiveInterval &NewLI = lis_.getOrCreateInterval(NewVReg);
200   NewLI.markNotSpillable();
201   newIntervals_->push_back(&NewLI);
202
203   // Finally we can rematerialize OrigMI before MI.
204   MachineBasicBlock &MBB = *MI->getParent();
205   tii_.reMaterialize(MBB, MI, NewLI.reg, 0, OrigMI, tri_);
206   MachineBasicBlock::iterator RematMI = MI;
207   SlotIndex DefIdx = lis_.InsertMachineInstrInMaps(--RematMI).getDefIndex();
208   DEBUG(dbgs() << "\tremat:  " << DefIdx << '\t' << *RematMI);
209
210   // Replace operands
211   for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
212     MachineOperand &MO = MI->getOperand(Ops[i]);
213     if (MO.isReg() && MO.isUse() && MO.getReg() == li_->reg) {
214       MO.setReg(NewVReg);
215       MO.setIsKill();
216     }
217   }
218   DEBUG(dbgs() << "\t        " << UseIdx << '\t' << *MI);
219
220   VNInfo *DefVNI = NewLI.getNextValue(DefIdx, 0, true,
221                                        lis_.getVNInfoAllocator());
222   NewLI.addRange(LiveRange(DefIdx, UseIdx.getDefIndex(), DefVNI));
223   DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
224   return true;
225 }
226
227 /// reMaterializeAll - Try to rematerialize as many uses of li_ as possible,
228 /// and trim the live ranges after.
229 void InlineSpiller::reMaterializeAll() {
230   // Do a quick scan of the interval values to find if any are remattable.
231   reMattable_.clear();
232   usedValues_.clear();
233   for (LiveInterval::const_vni_iterator I = li_->vni_begin(),
234        E = li_->vni_end(); I != E; ++I) {
235     VNInfo *VNI = *I;
236     if (VNI->isUnused() || !VNI->isDefAccurate())
237       continue;
238     MachineInstr *DefMI = lis_.getInstructionFromIndex(VNI->def);
239     if (!DefMI || !tii_.isTriviallyReMaterializable(DefMI))
240       continue;
241     reMattable_.insert(VNI);
242   }
243
244   // Often, no defs are remattable.
245   if (reMattable_.empty())
246     return;
247
248   // Try to remat before all uses of li_->reg.
249   bool anyRemat = false;
250   for (MachineRegisterInfo::use_nodbg_iterator
251        RI = mri_.use_nodbg_begin(li_->reg);
252        MachineInstr *MI = RI.skipInstruction();)
253      anyRemat |= reMaterializeFor(MI);
254
255   if (!anyRemat)
256     return;
257
258   // Remove any values that were completely rematted.
259   bool anyRemoved = false;
260   for (SmallPtrSet<VNInfo*, 8>::iterator I = reMattable_.begin(),
261        E = reMattable_.end(); I != E; ++I) {
262     VNInfo *VNI = *I;
263     if (VNI->hasPHIKill() || usedValues_.count(VNI))
264       continue;
265     MachineInstr *DefMI = lis_.getInstructionFromIndex(VNI->def);
266     DEBUG(dbgs() << "\tremoving dead def: " << VNI->def << '\t' << *DefMI);
267     lis_.RemoveMachineInstrFromMaps(DefMI);
268     vrm_.RemoveMachineInstrFromMaps(DefMI);
269     DefMI->eraseFromParent();
270     li_->removeValNo(VNI);
271     anyRemoved = true;
272   }
273
274   if (!anyRemoved)
275     return;
276
277   // Removing values may cause debug uses where li_ is not live.
278   for (MachineRegisterInfo::use_iterator RI = mri_.use_begin(li_->reg);
279        MachineInstr *MI = RI.skipInstruction();) {
280     if (!MI->isDebugValue())
281       continue;
282     // Try to preserve the debug value if li_ is live immediately after it.
283     MachineBasicBlock::iterator NextMI = MI;
284     ++NextMI;
285     if (NextMI != MI->getParent()->end() && !lis_.isNotInMIMap(NextMI)) {
286       SlotIndex NearIdx = lis_.getInstructionIndex(NextMI);
287       if (li_->liveAt(NearIdx))
288         continue;
289     }
290     DEBUG(dbgs() << "Removing debug info due to remat:" << "\t" << *MI);
291     MI->eraseFromParent();
292   }
293 }
294
295 /// If MI is a load or store of stackSlot_, it can be removed.
296 bool InlineSpiller::coalesceStackAccess(MachineInstr *MI) {
297   int FI = 0;
298   unsigned reg;
299   if (!(reg = tii_.isLoadFromStackSlot(MI, FI)) &&
300       !(reg = tii_.isStoreToStackSlot(MI, FI)))
301     return false;
302
303   // We have a stack access. Is it the right register and slot?
304   if (reg != li_->reg || FI != stackSlot_)
305     return false;
306
307   DEBUG(dbgs() << "Coalescing stack access: " << *MI);
308   lis_.RemoveMachineInstrFromMaps(MI);
309   MI->eraseFromParent();
310   return true;
311 }
312
313 /// foldMemoryOperand - Try folding stack slot references in Ops into MI.
314 /// Return true on success, and MI will be erased.
315 bool InlineSpiller::foldMemoryOperand(MachineBasicBlock::iterator MI,
316                                       const SmallVectorImpl<unsigned> &Ops) {
317   // TargetInstrInfo::foldMemoryOperand only expects explicit, non-tied
318   // operands.
319   SmallVector<unsigned, 8> FoldOps;
320   for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
321     unsigned Idx = Ops[i];
322     MachineOperand &MO = MI->getOperand(Idx);
323     if (MO.isImplicit())
324       continue;
325     // FIXME: Teach targets to deal with subregs.
326     if (MO.getSubReg())
327       return false;
328     // Tied use operands should not be passed to foldMemoryOperand.
329     if (!MI->isRegTiedToDefOperand(Idx))
330       FoldOps.push_back(Idx);
331   }
332
333   MachineInstr *FoldMI = tii_.foldMemoryOperand(MI, FoldOps, stackSlot_);
334   if (!FoldMI)
335     return false;
336   lis_.ReplaceMachineInstrInMaps(MI, FoldMI);
337   vrm_.addSpillSlotUse(stackSlot_, FoldMI);
338   MI->eraseFromParent();
339   DEBUG(dbgs() << "\tfolded: " << *FoldMI);
340   return true;
341 }
342
343 /// insertReload - Insert a reload of NewLI.reg before MI.
344 void InlineSpiller::insertReload(LiveInterval &NewLI,
345                                  MachineBasicBlock::iterator MI) {
346   MachineBasicBlock &MBB = *MI->getParent();
347   SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex();
348   tii_.loadRegFromStackSlot(MBB, MI, NewLI.reg, stackSlot_, rc_, &tri_);
349   --MI; // Point to load instruction.
350   SlotIndex LoadIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex();
351   vrm_.addSpillSlotUse(stackSlot_, MI);
352   DEBUG(dbgs() << "\treload:  " << LoadIdx << '\t' << *MI);
353   VNInfo *LoadVNI = NewLI.getNextValue(LoadIdx, 0, true,
354                                        lis_.getVNInfoAllocator());
355   NewLI.addRange(LiveRange(LoadIdx, Idx, LoadVNI));
356 }
357
358 /// insertSpill - Insert a spill of NewLI.reg after MI.
359 void InlineSpiller::insertSpill(LiveInterval &NewLI,
360                                 MachineBasicBlock::iterator MI) {
361   MachineBasicBlock &MBB = *MI->getParent();
362   SlotIndex Idx = lis_.getInstructionIndex(MI).getDefIndex();
363   tii_.storeRegToStackSlot(MBB, ++MI, NewLI.reg, true, stackSlot_, rc_, &tri_);
364   --MI; // Point to store instruction.
365   SlotIndex StoreIdx = lis_.InsertMachineInstrInMaps(MI).getDefIndex();
366   vrm_.addSpillSlotUse(stackSlot_, MI);
367   DEBUG(dbgs() << "\tspilled: " << StoreIdx << '\t' << *MI);
368   VNInfo *StoreVNI = NewLI.getNextValue(Idx, 0, true,
369                                         lis_.getVNInfoAllocator());
370   NewLI.addRange(LiveRange(Idx, StoreIdx, StoreVNI));
371 }
372
373 void InlineSpiller::spill(LiveInterval *li,
374                           std::vector<LiveInterval*> &newIntervals,
375                           SmallVectorImpl<LiveInterval*> &spillIs,
376                           SlotIndex *earliestIndex) {
377   DEBUG(dbgs() << "Inline spilling " << *li << "\n");
378   assert(li->isSpillable() && "Attempting to spill already spilled value.");
379   assert(!li->isStackSlot() && "Trying to spill a stack slot.");
380
381   li_ = li;
382   newIntervals_ = &newIntervals;
383   rc_ = mri_.getRegClass(li->reg);
384   spillIs_ = &spillIs;
385
386   if (split())
387     return;
388
389   reMaterializeAll();
390
391   // Remat may handle everything.
392   if (li_->empty())
393     return;
394
395   stackSlot_ = vrm_.getStackSlot(li->reg);
396   if (stackSlot_ == VirtRegMap::NO_STACK_SLOT)
397     stackSlot_ = vrm_.assignVirt2StackSlot(li->reg);
398
399   // Iterate over instructions using register.
400   for (MachineRegisterInfo::reg_iterator RI = mri_.reg_begin(li->reg);
401        MachineInstr *MI = RI.skipInstruction();) {
402
403     // Debug values are not allowed to affect codegen.
404     if (MI->isDebugValue()) {
405       // Modify DBG_VALUE now that the value is in a spill slot.
406       uint64_t Offset = MI->getOperand(1).getImm();
407       const MDNode *MDPtr = MI->getOperand(2).getMetadata();
408       DebugLoc DL = MI->getDebugLoc();
409       if (MachineInstr *NewDV = tii_.emitFrameIndexDebugValue(mf_, stackSlot_,
410                                                            Offset, MDPtr, DL)) {
411         DEBUG(dbgs() << "Modifying debug info due to spill:" << "\t" << *MI);
412         MachineBasicBlock *MBB = MI->getParent();
413         MBB->insert(MBB->erase(MI), NewDV);
414       } else {
415         DEBUG(dbgs() << "Removing debug info due to spill:" << "\t" << *MI);
416         MI->eraseFromParent();
417       }
418       continue;
419     }
420
421     // Stack slot accesses may coalesce away.
422     if (coalesceStackAccess(MI))
423       continue;
424
425     // Analyze instruction.
426     bool Reads, Writes;
427     SmallVector<unsigned, 8> Ops;
428     tie(Reads, Writes) = MI->readsWritesVirtualRegister(li->reg, &Ops);
429
430     // Attempt to fold memory ops.
431     if (foldMemoryOperand(MI, Ops))
432       continue;
433
434     // Allocate interval around instruction.
435     // FIXME: Infer regclass from instruction alone.
436     unsigned NewVReg = mri_.createVirtualRegister(rc_);
437     vrm_.grow();
438     LiveInterval &NewLI = lis_.getOrCreateInterval(NewVReg);
439     NewLI.markNotSpillable();
440
441     if (Reads)
442       insertReload(NewLI, MI);
443
444     // Rewrite instruction operands.
445     bool hasLiveDef = false;
446     for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
447       MachineOperand &MO = MI->getOperand(Ops[i]);
448       MO.setReg(NewVReg);
449       if (MO.isUse()) {
450         if (!MI->isRegTiedToDefOperand(Ops[i]))
451           MO.setIsKill();
452       } else {
453         if (!MO.isDead())
454           hasLiveDef = true;
455       }
456     }
457
458     // FIXME: Use a second vreg if instruction has no tied ops.
459     if (Writes && hasLiveDef)
460       insertSpill(NewLI, MI);
461
462     DEBUG(dbgs() << "\tinterval: " << NewLI << '\n');
463     newIntervals.push_back(&NewLI);
464   }
465 }