Something that kills a super-register also
[oota-llvm.git] / lib / CodeGen / RegisterScavenging.cpp
1 //===-- RegisterScavenging.cpp - Machine register scavenging --------------===//
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 // This file implements the machine register scavenger. It can provide
11 // information, such as unused registers, at any point in a machine basic block.
12 // It also provides a mechanism to make registers available by evicting them to
13 // spill slots.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #define DEBUG_TYPE "reg-scavenging"
18 #include "llvm/CodeGen/RegisterScavenging.h"
19 #include "llvm/CodeGen/MachineFunction.h"
20 #include "llvm/CodeGen/MachineBasicBlock.h"
21 #include "llvm/CodeGen/MachineInstr.h"
22 #include "llvm/Target/TargetRegisterInfo.h"
23 #include "llvm/Target/TargetInstrInfo.h"
24 #include "llvm/Target/TargetMachine.h"
25 #include "llvm/ADT/STLExtras.h"
26 using namespace llvm;
27
28 /// RedefinesSuperRegPart - Return true if the specified register is redefining
29 /// part of a super-register.
30 static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg,
31                                   const TargetRegisterInfo *TRI) {
32   bool SeenSuperUse = false;
33   bool SeenSuperDef = false;
34   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
35     const MachineOperand &MO = MI->getOperand(i);
36     if (!MO.isRegister())
37       continue;
38     if (TRI->isSuperRegister(SubReg, MO.getReg()))
39       if (MO.isUse())
40         SeenSuperUse = true;
41       else if (MO.isImplicit())
42         SeenSuperDef = true;
43   }
44
45   return SeenSuperDef && SeenSuperUse;
46 }
47
48 static bool RedefinesSuperRegPart(const MachineInstr *MI,
49                                   const MachineOperand &MO,
50                                   const TargetRegisterInfo *TRI) {
51   assert(MO.isRegister() && MO.isDef() && "Not a register def!");
52   return RedefinesSuperRegPart(MI, MO.getReg(), TRI);
53 }
54
55 /// setUsed - Set the register and its sub-registers as being used.
56 void RegScavenger::setUsed(unsigned Reg) {
57   RegsAvailable.reset(Reg);
58
59   for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
60        unsigned SubReg = *SubRegs; ++SubRegs)
61     RegsAvailable.reset(SubReg);
62 }
63
64 /// setUnused - Set the register and its sub-registers as being unused.
65 void RegScavenger::setUnused(unsigned Reg, const MachineInstr *MI) {
66   RegsAvailable.set(Reg);
67
68   for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
69        unsigned SubReg = *SubRegs; ++SubRegs)
70     if (!RedefinesSuperRegPart(MI, Reg, TRI))
71       RegsAvailable.set(SubReg);
72 }
73
74 void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
75   const MachineFunction &MF = *mbb->getParent();
76   const TargetMachine &TM = MF.getTarget();
77   TII = TM.getInstrInfo();
78   TRI = TM.getRegisterInfo();
79
80   assert((NumPhysRegs == 0 || NumPhysRegs == TRI->getNumRegs()) &&
81          "Target changed?");
82
83   if (!MBB) {
84     NumPhysRegs = TRI->getNumRegs();
85     RegsAvailable.resize(NumPhysRegs);
86
87     // Create reserved registers bitvector.
88     ReservedRegs = TRI->getReservedRegs(MF);
89
90     // Create callee-saved registers bitvector.
91     CalleeSavedRegs.resize(NumPhysRegs);
92     const unsigned *CSRegs = TRI->getCalleeSavedRegs();
93     if (CSRegs != NULL)
94       for (unsigned i = 0; CSRegs[i]; ++i)
95         CalleeSavedRegs.set(CSRegs[i]);
96   }
97
98   MBB = mbb;
99   ScavengedReg = 0;
100   ScavengedRC = NULL;
101
102   // All registers started out unused.
103   RegsAvailable.set();
104
105   // Reserved registers are always used.
106   RegsAvailable ^= ReservedRegs;
107
108   // Live-in registers are in use.
109   if (!MBB->livein_empty())
110     for (MachineBasicBlock::const_livein_iterator I = MBB->livein_begin(),
111            E = MBB->livein_end(); I != E; ++I)
112       setUsed(*I);
113
114   Tracking = false;
115 }
116
117 void RegScavenger::restoreScavengedReg() {
118   if (!ScavengedReg)
119     return;
120
121   TII->loadRegFromStackSlot(*MBB, MBBI, ScavengedReg,
122                                 ScavengingFrameIndex, ScavengedRC);
123   MachineBasicBlock::iterator II = prior(MBBI);
124   TRI->eliminateFrameIndex(II, 0, this);
125   setUsed(ScavengedReg);
126   ScavengedReg = 0;
127   ScavengedRC = NULL;
128 }
129
130 void RegScavenger::forward() {
131   // Move ptr forward.
132   if (!Tracking) {
133     MBBI = MBB->begin();
134     Tracking = true;
135   } else {
136     assert(MBBI != MBB->end() && "Already at the end of the basic block!");
137     MBBI = next(MBBI);
138   }
139
140   MachineInstr *MI = MBBI;
141   const TargetInstrDesc &TID = MI->getDesc();
142
143   // Reaching a terminator instruction. Restore a scavenged register (which
144   // must be life out.
145   if (TID.isTerminator())
146     restoreScavengedReg();
147
148   // Process uses first.
149   BitVector ChangedRegs(NumPhysRegs);
150   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
151     const MachineOperand &MO = MI->getOperand(i);
152     if (!MO.isRegister() || !MO.isUse())
153       continue;
154
155     unsigned Reg = MO.getReg();
156     if (Reg == 0) continue;
157
158     if (!isUsed(Reg)) {
159       // Register has been scavenged. Restore it!
160       if (Reg != ScavengedReg)
161         assert(false && "Using an undefined register!");
162       else
163         restoreScavengedReg();
164     }
165
166     if (MO.isKill() && !isReserved(Reg)) {
167       ChangedRegs.set(Reg);
168
169       // Mark sub-registers as changed if they aren't defined in the same
170       // instruction.
171       for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
172            unsigned SubReg = *SubRegs; ++SubRegs)
173         ChangedRegs.set(SubReg);
174     }
175   }
176
177   // Change states of all registers after all the uses are processed to guard
178   // against multiple uses.
179   setUnused(ChangedRegs);
180
181   // Process defs.
182   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
183     const MachineOperand &MO = MI->getOperand(i);
184
185     if (!MO.isRegister() || !MO.isDef())
186       continue;
187
188     unsigned Reg = MO.getReg();
189
190     // If it's dead upon def, then it is now free.
191     if (MO.isDead()) {
192       setUnused(Reg, MI);
193       continue;
194     }
195
196     // Skip two-address destination operand.
197     if (TID.findTiedToSrcOperand(i) != -1) {
198       assert(isUsed(Reg) && "Using an undefined register!");
199       continue;
200     }
201
202     // Skip is this is merely redefining part of a super-register.
203     if (RedefinesSuperRegPart(MI, MO, TRI))
204       continue;
205
206     assert((isUnused(Reg) || isReserved(Reg)) &&
207            "Re-defining a live register!");
208     setUsed(Reg);
209   }
210 }
211
212 void RegScavenger::backward() {
213   assert(Tracking && "Not tracking states!");
214   assert(MBBI != MBB->begin() && "Already at start of basic block!");
215   // Move ptr backward.
216   MBBI = prior(MBBI);
217
218   MachineInstr *MI = MBBI;
219   // Process defs first.
220   const TargetInstrDesc &TID = MI->getDesc();
221   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
222     const MachineOperand &MO = MI->getOperand(i);
223     if (!MO.isRegister() || !MO.isDef())
224       continue;
225     // Skip two-address destination operand.
226     if (TID.findTiedToSrcOperand(i) != -1)
227       continue;
228     unsigned Reg = MO.getReg();
229     assert(isUsed(Reg));
230     if (!isReserved(Reg))
231       setUnused(Reg, MI);
232   }
233
234   // Process uses.
235   BitVector ChangedRegs(NumPhysRegs);
236   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
237     const MachineOperand &MO = MI->getOperand(i);
238     if (!MO.isRegister() || !MO.isUse())
239       continue;
240     unsigned Reg = MO.getReg();
241     if (Reg == 0)
242       continue;
243     assert(isUnused(Reg) || isReserved(Reg));
244     ChangedRegs.set(Reg);
245
246     // Set the sub-registers as "used".
247     for (const unsigned *SubRegs = TRI->getSubRegisters(Reg);
248          unsigned SubReg = *SubRegs; ++SubRegs)
249       ChangedRegs.set(SubReg);
250   }
251   setUsed(ChangedRegs);
252 }
253
254 void RegScavenger::getRegsUsed(BitVector &used, bool includeReserved) {
255   if (includeReserved)
256     used = ~RegsAvailable;
257   else
258     used = ~RegsAvailable & ~ReservedRegs;
259 }
260
261 /// CreateRegClassMask - Set the bits that represent the registers in the
262 /// TargetRegisterClass.
263 static void CreateRegClassMask(const TargetRegisterClass *RC, BitVector &Mask) {
264   for (TargetRegisterClass::iterator I = RC->begin(), E = RC->end(); I != E;
265        ++I)
266     Mask.set(*I);
267 }
268
269 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
270                                      const BitVector &Candidates) const {
271   // Mask off the registers which are not in the TargetRegisterClass.
272   BitVector RegsAvailableCopy(NumPhysRegs, false);
273   CreateRegClassMask(RegClass, RegsAvailableCopy);
274   RegsAvailableCopy &= RegsAvailable;
275
276   // Restrict the search to candidates.
277   RegsAvailableCopy &= Candidates;
278
279   // Returns the first unused (bit is set) register, or 0 is none is found.
280   int Reg = RegsAvailableCopy.find_first();
281   return (Reg == -1) ? 0 : Reg;
282 }
283
284 unsigned RegScavenger::FindUnusedReg(const TargetRegisterClass *RegClass,
285                                      bool ExCalleeSaved) const {
286   // Mask off the registers which are not in the TargetRegisterClass.
287   BitVector RegsAvailableCopy(NumPhysRegs, false);
288   CreateRegClassMask(RegClass, RegsAvailableCopy);
289   RegsAvailableCopy &= RegsAvailable;
290
291   // If looking for a non-callee-saved register, mask off all the callee-saved
292   // registers.
293   if (ExCalleeSaved)
294     RegsAvailableCopy &= ~CalleeSavedRegs;
295
296   // Returns the first unused (bit is set) register, or 0 is none is found.
297   int Reg = RegsAvailableCopy.find_first();
298   return (Reg == -1) ? 0 : Reg;
299 }
300
301 /// calcDistanceToUse - Calculate the distance to the first use of the
302 /// specified register.
303 static unsigned calcDistanceToUse(MachineBasicBlock *MBB,
304                                   MachineBasicBlock::iterator I, unsigned Reg,
305                                   const TargetRegisterInfo *TRI) {
306   unsigned Dist = 0;
307   I = next(I);
308   while (I != MBB->end()) {
309     Dist++;
310     if (I->readsRegister(Reg, TRI))
311         return Dist;
312     I = next(I);    
313   }
314   return Dist + 1;
315 }
316
317 unsigned RegScavenger::scavengeRegister(const TargetRegisterClass *RC,
318                                         MachineBasicBlock::iterator I,
319                                         int SPAdj) {
320   assert(ScavengingFrameIndex >= 0 &&
321          "Cannot scavenge a register without an emergency spill slot!");
322
323   // Mask off the registers which are not in the TargetRegisterClass.
324   BitVector Candidates(NumPhysRegs, false);
325   CreateRegClassMask(RC, Candidates);
326   Candidates ^= ReservedRegs;  // Do not include reserved registers.
327
328   // Exclude all the registers being used by the instruction.
329   for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
330     MachineOperand &MO = I->getOperand(i);
331     if (MO.isRegister())
332       Candidates.reset(MO.getReg());
333   }
334
335   // Find the register whose use is furthest away.
336   unsigned SReg = 0;
337   unsigned MaxDist = 0;
338   int Reg = Candidates.find_first();
339   while (Reg != -1) {
340     unsigned Dist = calcDistanceToUse(MBB, I, Reg, TRI);
341     if (Dist >= MaxDist) {
342       MaxDist = Dist;
343       SReg = Reg;
344     }
345     Reg = Candidates.find_next(Reg);
346   }
347
348   if (ScavengedReg != 0) {
349     // First restore previously scavenged register.
350     TII->loadRegFromStackSlot(*MBB, I, ScavengedReg,
351                               ScavengingFrameIndex, ScavengedRC);
352     MachineBasicBlock::iterator II = prior(I);
353     TRI->eliminateFrameIndex(II, SPAdj, this);
354   }
355
356   TII->storeRegToStackSlot(*MBB, I, SReg, true, ScavengingFrameIndex, RC);
357   MachineBasicBlock::iterator II = prior(I);
358   TRI->eliminateFrameIndex(II, SPAdj, this);
359   ScavengedReg = SReg;
360   ScavengedRC = RC;
361
362   return SReg;
363 }